我的想法是:
- 对 service.example.com 的请求应重定向到 service.example.com,
- 对 example.com 的所有其他请求都应重定向到 base.example.com
我的主机配置如下:存在 example.com 目录,并且所有子域都位于其子目录中(example.com/service、example.com/base 等)。
我如何才能实现所需的重定向?
我尝试过 RedirectMatch、RewriteCond、RewriteRule,但没有结果。我的尝试是:
RewriteCond %{HTTP_HOST} ^service\.example\.com$ [NC]
RewriteRule ^(.*)$ http://service.example.com/$1 [R=301,L]
RewriteCond %{HTTP_HOST} !^base\.example\.com$ [NC]
RewriteRule ^(.*)$ http://base.example.com/$1 [R=301,L]
它只对 base.example.com 有效。对于 service.example.com,存在重写/重定向循环。
我只能找到简单重写的例子,一个域->其他域,或者多个域->一个域,但我的情况不同:多个域->许多其他域。
编辑:好的,我明白了:
RewriteCond %{HTTP_HOST} ^service\.example\.com$ [NC]
RewriteRule ^(.*)$ - [L]
RewriteCond %{HTTP_HOST} !^base\.example\.com$ [NC]
RewriteRule ^(.*)$ http://base.example.com/$1 [R=301,L]
关键是使用一条规则来什么都不做:- [L]
。
答案1
RewriteCond %{HTTP_HOST} ^service\.example\.com$ [NC] RewriteRule ^(.*)$ - [L] RewriteCond %{HTTP_HOST} !^base\.example\.com$ [NC] RewriteRule ^(.*)$ http://base.example.com/$1 [R=301,L]
或者简单地...
RewriteCond %{HTTP_HOST} !^(base|service)\.example\.com$
RewriteRule (.*) http://base.example.com/$1 [R=301,L]
但是...如果你将此.htaccess
文件放在父目录中(我认为你必须这样做),那么这可能无法按预期工作,因为“隐藏”子目录(子域指向的目录)也将被捕获RewriteRule
图案并包含在重定向中。(或者这就是意图?!)
例如,给定一个foo
指向相应子目录的子域example.com/foo
,并且您请求http:://foo.example.com/bar
,则上述指令将把请求重定向到http://base.example.com/foo/bar
,而不是http://base.example.com/bar
(我认为这是意图)。这是因为RewriteRule
图案捕获此上下文中的文件路径(URL 映射到的路径),而不是 URL 路径。
为了解决这个问题,您需要使用REQUEST_URI
服务器变量,它保存请求的根相对 URL 路径。
例如:
RewriteCond %{HTTP_HOST} !^(base|service)\.example\.com$
RewriteRule ^ http://base.example.com%{REQUEST_URI} [R=302,L]
首先使用 302(临时)重定向进行测试,以避免潜在的缓存问题,并且只有在确认一切正常后才将其更改为 301(永久) - 如果这是意图。
您需要在测试之前清除浏览器缓存。