如何创建仅匹配没有查询字符串的请求的重写规则?
http://www.mysite.com/index.php
应重新映射到:
http://www.mysite.com/
但
http://www.mysite.com/index.php?page=some_page
不应打扰。
我正在尝试这个:
RewriteRule ^/index.php$ http://www.mysite.com/ [R=301,L]
...但是它匹配以 /index.php 开头的任何内容,即使我明确地用美元符号结束了该模式。
更新:
在此之前唯一的规则是:
RewriteCond %{HTTP_HOST} ^mysite.com [NC]
RewriteRule ^/(.*) http://www.mysite.com/$1 [R=301,L]
目的是将非 www 链接重定向到 www 版本。
答案1
第一组规则上的 [L] 标志如下:
RewriteCond %{HTTP_HOST} ^mysite.com [NC]
RewriteRule ^/(.*) http://www.mysite.com/$1 [R=301,L]
L
表示最后一个 —— 当到达最后一个时,Apache 将停止处理本次迭代的规则。
去掉这个L
标志,你就没事了。
答案2
以下是我想到的解决方案:
RewriteCond %{QUERY_STRING} ^$
RewriteRule ^/index.php$ / [R=301,L]
答案3
RewriteCond !%{QUERY_STRING} 将匹配没有查询字符串的请求。
您还可以添加以下内容来打开 mod_rewrite RewriteLog logs/rewrite_log RewriteLogLevel 3 的日志记录和调试
请注意,这可能会减慢您的网站速度并填满您的日志,因此只能将其用于调试。
答案4
所有这些重写都是 RegExp,速度相当慢。如果你从以下位置执行,速度应该会快一点index.php
:
if (!strlen($_SERVER["QUERY_STRING"])) header("Location: /");