.htaccess RewriteRule用于多个子域

时间:2016-07-14 11:14:36

标签: .htaccess redirect mod-rewrite

我们正在转移到另一个域,并希望重定向所有旧流量:

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进行重定向,因此我们更倾向于使用该解决方案。 RewriteRule本身没有看到域名(* .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?

2 个答案:

答案 0 :(得分:1)

可以RewriteCond捕获正则表达式变量,其方式与RewriteRule的方式非常相似。

当您反向引用捕获的变量时,语法的差异在于您使用%而不是$

例如而不是:

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 :(得分:0)

用于多个子域重定向特定的特定路径重定向。 请在您的.htaccess文件中添加以下代码。

RewriteCond %{HTTP_HOST} abc.com$ [NC]
RewriteRule ^ abcd.com%{REQUEST_URI} [R=301,L,NE]

RewriteCond %{HTTP_HOST} ab.com$ [NC]
RewriteRule ^ abs.com%{REQUEST_URI} [R=301,L,NE]