2016-07-14 75 views
1

我們移動到另一個域名,並希望重定向所有的舊交通:爲多個子域的.htaccess重寫規則

en.site1.com/whatever >>> en.site2.com/whatever 
cz.site1.com/whatever >>> cz.site2.com/whatever 
fr.site1.com/whatever >>> fr.site2.com/whatever 
# ...and so on 

目前,我們正在使用重定向的.htaccess,所以我們使用喜歡的解決方案。重寫規則本身不看域名(* example.com)的情況,所以我們必須使用RewriteConds:

RewriteCond %{HTTP_HOST} en.site1.com 
RewriteRule ^(.*)$ http://en.site2.com/$1 [R=301] 

RewriteCond %{HTTP_HOST} cz.site1.com 
RewriteRule ^(.*)$ http://cz.site2.com/$1 [R=301] 

RewriteCond %{HTTP_HOST} fr.site1.com 
RewriteRule ^(.*)$ http://fr.site2.com/$1 [R=301] 

# ...and so on 

這樣做對於每個X支持的語言過於冗長。我想,會使用一個正則表達式或東西,而不是列出所有語言的解決方案:

# $0 is the regex match from RewriteCond 
RewriteCond %{HTTP_HOST} ^(.*).site1.com 
RewriteRule ^(.*)$ http://$0.site2.com/$1 [R=301] 

這可能嗎?或者有沒有在.htaccess任何其他方式不包括廣泛的copypasting?

回答

1

可以RewriteCond捕獲正則表達式變量的方法與您從RewriteRule可以獲得的方式大致相同。

在語法上的差別,當你反向引用捕獲的變量,就是你用%而不是$

EG。相反的:

RewriteCond %{HTTP_HOST} en.site1.com 
RewriteRule ^(.*)$ http://en.site2.com/$1 [R=301] 

RewriteCond %{HTTP_HOST} cz.site1.com 
RewriteRule ^(.*)$ http://cz.site2.com/$1 [R=301] 

RewriteCond %{HTTP_HOST} fr.site1.com 
RewriteRule ^(.*)$ http://fr.site2.com/$1 [R=301] 

你可以使用:

RewriteCond %{HTTP_HOST} ([a-z]{2}).site1.com 
RewriteRule ^(.*)$ http://%1.site2.com/$1 [R=301] 
+1

謝謝!像魅力一樣工作。當我知道要尋找什麼,我甚至發現這個文件中提及。 作爲參考和後來的讀者: http://httpd.apache.org/docs/current/mod/mod_rewrite.html (約RewriteCond指令科) –