.htaccess 将多个域名重定向/重写到多个域名

.htaccess 将多个域名重定向/重写到多个域名

我的想法是:

  • 对 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(永久) - 如果这是意图。

您需要在测试之前清除浏览器缓存。

相关内容