.htaccess:使用RewriteCond中的域名

时间:2012-07-11 14:26:12

标签: .htaccess

我一直在谷歌搜索我遇到的问题,到目前为止,我发现没有任何效果。

我所拥有的是Drupal多站点安装,我正在尝试为移动设备重定向。首先,我有10个域只有一个共同的字符串,www。我想要的是检查查看该网站的设备是否是移动设备(我正在使用AMF成功执行此操作)并确保访问者不在移动版本上,该版本将是m.domain.tld。如果一切都很好,那么我需要将用户重定向到移动子域。

每个域执行此操作的方法如下:

RewriteCond %{ENV:AMF_DEVICE_IS_MOBILE} ^true$
RewriteCond %{ENV:AMF_DEVICE_IS_TABLET} !^true$
RewriteCond %{HTTP_HOST} !^[m.]+mysite.com$
RewriteRule (.*) http://m.mysite.com/$1 [R=301,L]

但是,我不希望有10个这样的块(每个域1个),也不想每次创建新网站时都要创建另一个块。

我已经读过你可以在RewriteCond模式中使用()来制作匹配模式的var。不幸的是,我不认为我正在制作我的模式或其他东西,因为当我尝试以下时它会重定向到m。随后是uri的要求。

我为了简洁而省略了AMF条件。

RewriteCond %{HTTP_HOST} !^[m.]+([^.]\.[com|net|org])$
RewriteRule (.*) http://m.%1/$1 [R=301,L]

根据我的阅读,%1应该与RewriteCond中的模式相匹配,但它不匹配任何东西。这让我觉得我的模式是错误的。我已经尝试将([^。]。[com | net | org])更改为(。*),但在重定向到m时会遇到同样的问题。

我是否正确地假设我的模式是错误的,如果是这样我应该使用什么?我正在努力做甚么可能吗?

要明确的是,我的域名采用以下形式:

www.domain.com

www.anotherdomain.net

somedomain.org

www.maybeanotherdomain.com

在我的示例中,我有R = 301的标志,但在测试中我将其遗漏,每次测试时都必须从浏览器中清除大量数据,以确保我接受新规则。 / p>

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您无法反向引用匹配(!),但您可以将条件分为2个匹配%{HTTP_HOST} 变量:

RewriteCond %{HTTP_HOST} !^m\.
RewriteCond %{HTTP_HOST} ([^\.]+)\.(com|net|org)$ [NC]
RewriteRule (.*) http://m.%1.%2/$1 [R=301,L]

您可能需要根据自己的需要定制([^\.]+)\.位,此表达式仅匹配“www.domain.com”的“域”部分