【问题标题】:.htaccess: Using domain name from RewriteCond.htaccess:使用来自 RewriteCond 的域名
【发布时间】:2012-07-12 01:32:45
【问题描述】:

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

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

提前感谢您的帮助!

【问题讨论】:

    标签: .htaccess


    【解决方案1】:

    您不能反向引用 not 匹配项 (!),但您可以针对 %{HTTP_HOST} 变量将条件分成 2 个匹配项:

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

    您可能需要定制([^\.]+)\. 位以满足您的需要,此表达式将仅匹配 "www.domain.com""domain" 部分.

    【讨论】:

    • 太棒了!我从来没有看到任何人提到你以前不能这样做。太感谢了! :D
    • @JasonGray 如果有一种反向引用的方法,我不知道它是如何完成的,但是像!(expression) 这样的东西是行不通的。
    猜你喜欢
    • 2012-06-02
    • 2014-07-10
    • 2015-11-02
    • 2012-04-22
    • 2023-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    相关资源
    最近更新 更多