在RewriteRule中匹配HTTP_HOST而不是使用RewriteCond

时间:2010-11-26 08:33:59

标签: .htaccess mod-rewrite

我需要制作一堆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]

感谢。

2 个答案:

答案 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
在你的虚拟主机中,你已经完成了:)