我有一个测试服务器(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.com
,example.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]