我正在尝试在 Apache Web 服务器(服务器版本:Apache/2.2.15)上创建一系列唯一的重定向。使用 .htaccess 或其他 Apache 模块,我需要完全解析请求的 URL,以便提取不带标准 .com 后缀的主机名。
例如:我需要供应商名称来自主机名供应商名称.com。
我支持的业务与第三方供应商合作,并为每个供应商创建了唯一的顶级域名,指向文档根目录网络服务器。
例子: 供应商名称.com/logo.jpg加载一个也可以在以下位置访问的资产parentbusinessdomain.com/vendorname/logo.jpg
该惯例是 10 或 15 年前由企业制定的,并且有许多供应商。企业没有考虑到需要为每个唯一域支持 HTTPS/SSL 实施。如果他们使用子域(例如 vendorname.parentbusinessdomain.com),那么这将不成问题。展望未来,我们希望放弃这一惯例,只需托管来自https://parentbusinessdomain.com。
我不断遇到的问题是,似乎没有标准的 Apache 字符串操作或服务器端变量来表示或提取不带特定字符串“.com”的主机名。这种字符串提取在后端 PHP 或前端 Javascript 中是可行的,但似乎 .htaccess 本身的功能有限。
与自定义 Javascript 函数类似的示例:https://stackoverflow.com/a/16934798/602514
parseURL('https://www.facebook.com/100003379429021_356001651189146');
结果:
Object {
domain : "www.facebook.com",
host : "facebook",
path : "100003379429021_356001651189146",
protocol : "https",
subdomain : "www",
tld : "com"
}
应急措施是在遗留 Web 应用程序本身内探索 URL 重写/重定向,但希望从基础设施的角度来看可能会有一个更优雅的解决方案。
答案1
您可以使用 mod_rewrite 在文件顶部执行如下操作.htaccess
(尽管这在服务器配置中直接运行也同样有效):
RewriteEngine On
RewriteCond %{HTTP_HOST} !^example\.com
RewriteCond %{HTTP_HOST} ^(?:www\.)?([^.]+) [NC]
RewriteRule ^ https://example.com/%1%{REQUEST_URI} [R=302,L]
这将重定向<vendorname>.com/<anything>
到https://example.com/<vendorname>/<anything>
。其中<anything>
实际上可以是任何 URL 路径。任何查询字符串也会在重定向过程中保留。
example.com
是“父业务域”。第一个状况只是检查该请求是否已经针对目标域。
反向引用与从前面%1
请求的主机名中捕获的“供应商名称”匹配vendorname.com
条件模式。这允许使用可选的 www 子域。您提到您只有.com
域,但这可以与任何(多级)TLD 一起使用,只是假设没有其他子域(可选的 www 除外)。
首先使用 302(临时)重定向进行测试,然后仅更改为 301(永久) - 如果这是意图 - 一旦确认它按预期工作。
企业没有考虑到的是需要为每个唯一域名支持 HTTPS/SSL 实施。
只是好奇重定向如何解决这个问题?重定向只是为了保留 SEO 和任何指向以下形式的 URL 的第三方反向链接http://vendorname.com/logo.jpg
(仅限 HTTP)吗?(虽然您通常不会期望反向链接,logo.jpg
并且这个特定示例对 SEO 并没有太大帮助?)