1

我最近才发现有关 URL 重写的知识,所以我还有很多东西要学。

在遵循Easy Mod Rewrite教程时,他们的其中一个示例的结果确实让我感到困惑。

RewriteBase /
RewriteRule (.*) index.php?page=$1 [QSA,L]

重写/home/index.php?page=index.php&page=home.

我认为重复可能是由我的主机配置中的某些东西引起的,但是XAMPP的全新安装也是如此。

那么,有谁知道为什么这似乎解析了两次?

而且,在我看来,如果要这样做,那将是一个无限循环——为什么它会在 2 个循环时停止?

4

2 回答 2

2

来自此页面上的示例 1 ,这是您问题中链接的教程的一部分:

假设您使用的 CMS 系统将对所有内容的请求重写为单个 index.php 脚本。

RewriteRule ^(.*)$ index.php?PAGE=$1 [L,QSA]

然而,每次运行时,无论您请求哪个文件,PAGE 变量始终包含“index.php”。

为什么?您最终将进行两次重写。首先,您请求test.php。这被重写为index.php?PAGE=test.php。现在对index.php?PAGE=test.php发出第二个请求。这仍然与您的重写模式匹配,并反过来被重写为index.php?PAGE=index.php

一种解决方案是添加一个 RewriteCond 来检查文件是否已经是“index.php”。还允许您将图像和 CSS 文件保存在同一目录中的更好解决方案是使用 RewriteCond 来检查文件是否存在,使用 -f。


1该链接指向 Internet 存档,因为教程网站似乎已离线

于 2009-02-01T01:28:16.800 回答
2

Apache 模块 mod_rewrite 文档

'last|L' (last rule)
[...] 如果RewriteRule生成内部重定向 [...] 这将重新注入请求并导致从第一个开始重复处理RewriteRule

为了防止这种情况,您可以使用附加RewriteCond指令:

RewriteCond %{REQUEST_URI} !^/index\.php$
RewriteRule (.*) index.php?page=$1 [QSA,L]

或者您将模式更改为不匹配index.php并使用该REQUEST_URI变量,无论是在重定向中还是稍后在 PHP ( $_SERVER['REQUEST_URI']) 中。

RewriteRule !^index\.php$ index.php?page=%{REQUEST_URI} [QSA,L]
于 2009-02-01T12:26:34.100 回答