我需要制作一堆301重定向,其中包含来自同一.htaccess
文件的不同域。我可以为每个规则写一个RewriteCond,如下所示,它工作正常:
RewriteCond %{HTTP_HOST} www.domain1.com [NC]
RewriteRule old-url-1a.htm /new-url-1a [L,R=301]
RewriteCond %{HTTP_HOST} www.domain1.com [NC]
RewriteRule old-url-1b.htm /new-url-1b [L,R=301]
RewriteCond %{HTTP_HOST} www.domain2.com [NC]
RewriteRule old-url-2a.htm /new-url-2a [L,R=301]
RewriteCond %{HTTP_HOST} www.domain2.com [NC]
RewriteRule old-url-2b.htm /new-url-2b [L,R=301]
但是使用这种方法我需要为每个URL提供2行代码,这些代码非常冗长和重复(同一个RewriteCond重复多次)。 有没有办法可以在RewriteRule指令中匹配HTTP_HOST?沿着这些方向(概念上):
RewriteRule www.domain1.com/old-url-1a.htm /new-url-1a [L,R=301]
RewriteRule www.domain1.com/old-url-1b.htm /new-url-1b [L,R=301]
RewriteRule www.domain2.com/old-url-2a.htm /new-url-2a [L,R=301]
RewriteRule www.domain2.com/old-url-2b.htm /new-url-2b [L,R=301]
感谢。
答案 0 :(得分:2)
Apache文档说明了RewriteRule:
匹配什么?
模式最初将匹配主机名和端口之后以及查询字符串之前的URL部分。 如果您希望与主机名,端口或查询字符串匹配,使用带有%{HTTP_HOST} ,%{SERVER_PORT}或%{QUERY_STRING}变量的RewriteCond分别
但是如果你能够将规则放在apache-config中,还有另一种简写方法:你可以使用RewriteMap。
RewriteMap host-redirects txt:/etc/apache2/host-redirects.map
RewriteRule ^/([^/]*).htm$ http://%{HTTP_HOST}/${host-redirects:%{HTTP_HOST}/$1|$1} [R,L]
host-redirects.map看起来像这样:
www.domain1.com/old-url-1a.htm /new-url-1a/
www.domain1.com/old-url-1b.htm /new-url-1b/
www.domain2.com/old-url-2a.htm /new-url-2a/
答案 1 :(得分:1)
BTW映射可能是调试“真正匹配的”的唯一方法
您可以将RewriteLogLevel设置为9,日志不会显示使用RewriteCond
解析的内容。
相反,它说“它是否匹配”。 不太有用。
使用地图(RewriteMap
),日志清楚地说明了传递的密钥。
示例:
(/var/log/http/rewrite.log)
map lookup OK: map=host-redirects[txt] key=WHAT_IS_PARSED -> WHAT_IS_RETURNED
或
map lookup FAILED: map=host-redirects[txt] key=WHAT_IS_PARSED
使用RewriteRule,|之后的正确术语指定默认返回值 在大多数情况下,默认404.html页面或某种程度。 非常有用。
所以在你的httpd.conf中,设置
RewriteLog logs/rewrite.log
RewriteLofLevel 9
在你的虚拟主机中,你已经完成了:)