我需要将两个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]
我试图重新排序规则,但没有解决方案。
非常感谢。
答案 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