mod_rewrite多个域重写域名

时间:2013-08-18 12:18:07

标签: apache mod-rewrite mobile

我有很多域名可能带有或不带有www。对于其中一些域名,如果移动到m.domain.com,我想重定向它们。如果我做1个域,它就可以了。例如:

RewriteCond %{HTTP_ACCEPT} text/vnd.wap.wml [NC,OR]
RewriteCond %{HTTP_USER_AGENT} !(ipad|joojoo|tablet) [NC]
RewriteCond %{HTTP_USER_AGENT} \bagent1|agent2|agent3\b[NC]
RewriteCond %{HTTP_HOST} ^domain1\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.domain1\.com$
RewriteRule .* "http\:\/\/m\.domain1.com/" [R,L]

但是当我尝试捕获域名并在规则中使用它时,它似乎不起作用,例如:

RewriteCond %{HTTP_ACCEPT} text/vnd.wap.wml [NC,OR]
RewriteCond %{HTTP_USER_AGENT} !(ipad|joojoo|tablet) [NC]
RewriteCond %{HTTP_USER_AGENT} \bagent1|agent2|agent3\b[NC]
RewriteCond %{HTTP_HOST} ^(domain1\.com)$ [OR]
RewriteCond %{HTTP_HOST} ^www\.(domain1\.com)$ [OR]
RewriteCond %{HTTP_HOST} ^(domain2\.com)$ [OR]
RewriteCond %{HTTP_HOST} ^www\.(domain2\.com)$
RewriteRule .* "http\:\/\/m\.$1/" [R,L]

$ 1未设置域名。知道我做错了什么吗?

TIA

1 个答案:

答案 0 :(得分:1)

有两个问题
RewriteRule .* "http\:\/\/m\.$1/" [R,L]

其一,您不需要在替换网址路径中转义字符(例如此处为/),因为它不会被视为模式而只是文本。允许使用$%反向引用,但不需要转义。

其次,要捕获主机子组,您需要%1而不是$1,因为子组来自RewriteCond而不是RewriteRule。因此,您可以将.htaccess更改为

RewriteCond %{HTTP_ACCEPT} text/vnd.wap.wml [NC,OR]
RewriteCond %{HTTP_USER_AGENT} !(ipad|joojoo|tablet) [NC]
RewriteCond %{HTTP_USER_AGENT} \b(agent1|agent2|agent3)\b[NC]

RewriteCond %{HTTP_HOST} ^(?:www\.)?((?:domain1|domain2)\.com)$ [NC]
RewriteRule ^ http://m.%1/ [R=301,L]

%{HTTP_HOST}条件匹配任何以www\.开头的域名,但会将其设为可选(?: ... )?。接下来是domain1|domain2后跟.com