mod_rewrite多个域重写域名



我有一堆域名,可能有或没有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|agent3b[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|agent3b[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 未设置域名。知道我做错了什么吗?

蒂亚

有两件事有问题

RewriteRule .* "http://m.$1/" [R,L]

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

其次,要捕获主机子组,您需要%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

最新更新