当没有查询字符串时,如何仅重定向 index.php?

当没有查询字符串时,如何仅重定向 index.php?

如何创建仅匹配没有查询字符串的请求的重写规则?

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: /");

相关内容