2010-11-26 34 views
0

我有一堆301重定向,我需要在同一個.htaccess文件中包含不同的域。我可以寫爲下面的每個規則的RewriteCond和正常工作:在RewriteRule中匹配HTTP_HOST而不是使用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] 

謝謝。

回答

1

Apache文檔說,關於重寫規則:

什麼是匹配的?

該模式最初將與主機名和端口之後以及查詢字符串之前的URL部分進行匹配。 如果您希望與主機名,端口或查詢字符串匹配,請分別使用RewriteCond和%{HTTP_HOST},%{SERVER_PORT}或%{QUERY_STRING}變量。

但是,如果您能夠將規則放入您的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/ 
+0

謝謝你把我介紹給這個!不幸的是,我的系統管理員不會讓我改變Apache的配置,所以我想我將不得不求助於我的htaccess中的一大堆規則...... – 2010-11-26 10:06:56

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

使用重寫規則,經過正確的術語|指定默認的返回值。
在大多數情況下,默認404.html頁面或稍微。 非常有用

那麼在httpd.conf,設置你的虛擬主機
RewriteLog logs/rewrite.log RewriteLofLevel 9
,你就大功告成了:)

相關問題