1

我一直在谷歌上搜索我遇到的问题,到目前为止我还没有发现任何有用的东西。

我拥有的是一个 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,但在测试中我将其排除在外,并且每次测试时都必须从浏览器中清除大量数据,以确保我采用了新规则。

提前感谢您的帮助!

4

1 回答 1

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"的"domain"部分。

于 2012-07-11T17:32:45.493 回答