0

我需要将两个 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]

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

非常感谢。

4

1 回答 1

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

于 2012-05-28T13:54:14.820 回答