将两个mod_rewrite规则合并为一个

时间:2012-05-28 13:00:12

标签: .htaccess mod-rewrite

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

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

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]

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

非常感谢。

1 个答案:

答案 0 :(得分: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]

BTW ,如果您将%{HTTP_HOST}与正则表达式匹配(模式以^开头),那么它可以更好地逃脱点,因为在某些情况下它可以产生巨大的差异(可能不是在你的情况下,但仍然,因为点意味着"任何角色") - ^www\.domain\.com。或者使用纯字符串比较而不是正则表达式:=www.domain.com