apache mod_rewrite 变量主机名带有一个重定向吗?

apache mod_rewrite 变量主机名带有一个重定向吗?

我有一个测试服务器(webtest.example.com)和一个实时服务器(www.example.com)。

我还有 example.org、example.net 等。我希望将它们重定向到 example.com。我还希望将任何非 www 条目重定向到 www。

基本上,我只是想知道是否有更有效(即更少的行)的方法来处理这个问题?

RewriteCond %{HTTP_HOST} !^www\.example\.com$
RewriteCond %{HTTP_HOST} !^webtest\.example
RewriteRule ^(.*)$ http://www.example.com%{REQUEST_URI} [L,R=301]

RewriteCond %{HTTP_HOST} !^webtest\.example\.com$
RewriteCond %{HTTP_HOST} ^webtest\.example
RewriteRule ^(.*)$ http://webtest.example.com%{REQUEST_URI} [L,R=301]

..似乎可能有办法将这两个块合并为一个块..

答案1

从执行所需操作的规则开始,然后将它们组合起来。在问题中,您有 3 个要求和仅涵盖其中两个的规则 - 缺少一条规则。

一个关键提示是编写使用正匹配(以 foo 开头)而不是负匹配(以除 foo 之外的任何内容开头)的规则,否则需要排除,并且如果您在将来将其添加到规则集中 - 事情很容易被破坏。

将 example.notcom 重定向至 www.example.com

有很多例子为此,在这种特殊情况下:

RewriteCond %{HTTP_HOST} ^example
RewriteRule ^ http://www.example.com%{REQUEST_URI} [R=301,L]

无论是example.comexample.net还是example.org- 它们都以示例开头 - 匹配无 www 域请求并重定向到www.example.com

将 www.example.notcom 重定向至 www.example.com

为此,使用负向前瞻来排除www.example.com

RewriteCond %{HTTP_HOST} ^www\.example\.(?!com)$
RewriteRule ^ http://www.example.com%{REQUEST_URI} [L,R=301]

ie 匹配以 www.example 开头、不以 .com 结尾的任何主机

将 webtest.example.notcom 重定向到 webtest.example.com

类似地,使用负向前瞻可以将其标准化:

# capture the subdomain, and match hosts that don't end with .com
RewriteCond %{HTTP_HOST} ^webtest\.example\.(?!com)
RewriteRule ^ http://webtest.example.com%{REQUEST_URI} [L,R=301]

即匹配以 webtest.example 开头、不以 .com 结尾的任何主机

规则可以合并吗?

子域名上的可以是:

RewriteCond %{HTTP_HOST} ^(www|webtest)\.example\.(?!com)
RewriteRule ^ http://%1.example.com%{REQUEST_URI} [L,R=301]

然而,第一个不能轻易地包含在这里(至少,我想不出一个简单的方法来做到这一点)。

全部一起:

因此最终结果是:

# Redirect no-www requests to www.example.com
RewriteCond %{HTTP_HOST} ^example
RewriteRule ^ http://www.example.com%{REQUEST_URI} [R=301,L]

# Redirect requests on the wrong tld to .com
RewriteCond %{HTTP_HOST} ^(www|webtest)\.example\.(?!com)
RewriteRule ^ http://%1.example.com%{REQUEST_URI} [L,R=301]

相关内容