【问题标题】:Combine two mod_rewrite rule into one将两个 mod_rewrite 规则合二为一
【发布时间】:2012-05-28 21:54:14
【问题描述】:

我需要将两个 mod_rewrite 规则合二为一。

1) 在 CMS 中,有 index.php 处理网络上的所有查询。例如,如果 URI 是 domain.com/query-string,则 index.php 调用/包含所需的部分并显示内容。我这样做:

RewriteCond %{REQUEST_URI} !\.[[:alnum:]]+$
RewriteRule ^([^*]+) index.php [L,QSA] 

2) 我需要使用 HTTP 301 重定向将 www 永久移动到非 www。例如 www.domain.com 到 domain.com。我这样做:

RewriteCond %{HTTP_HOST} ^www.domain.com [NC]
RewriteRule ^(.*)$ http://domain.com/$1 [L,R=301]

但是当我将这两个规则都放入 htaccess 文件时,它会停止工作,并且 Web 重定向上的所有链接都会执行 index.php 并显示主页。因此,我需要将这两条规则合二为一。

.htaccess 的开头是:

RewriteEngine On
RewriteBase /

有什么解决办法,怎么办?

整个.htaccess:

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_URI} !\.[[:alnum:]]+$
RewriteRule ^([^*]+) index.php [L,QSA]

RewriteCond %{HTTP_HOST} ^www.domain.com [NC]
RewriteRule ^(.*)$ http://domain.com/$1 [L,R=301]

我尝试重新排序规则,但没有解决方案。

非常感谢。

【问题讨论】:

  • 你应该展示你的整个.htaccess(至少——重写规则部分,但全部)。问题很可能是规则的顺序(考虑到您迄今为止提供的规则——它们应该是 3-2-1 的顺序)
  • 我已将整个 htaccess 添加到第一篇文章中。

标签: .htaccess mod-rewrite


【解决方案1】:

这是正确的顺序。根据到目前为止提供的信息,我认为这不应该起作用(在测试机器上工作)。如果它仍然不起作用 - 那么可能在其他地方有另一个规则(或者在您的 PHP 应用程序中进行了重定向)。

RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_HOST} ^www\.domain\.com [NC]
RewriteRule ^(.*)$ http://domain.com/$1 [L,R=301]

RewriteCond %{REQUEST_URI} !\.[[:alnum:]]+$
RewriteRule ^([^*]+) index.php [L,QSA]

顺便说一句,如果您将%{HTTP_HOST} 与正则表达式匹配(模式以^ 开头),那么最好转义点,因为在某些情况下它可以产生巨大的差异(可能不在您的情况,但仍然,因为点表示“任何字符”)--^www\.domain\.com。或者使用纯字符串比较而不是正则表达式:=www.domain.com

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-08
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多