为什么mod_rewrite会重写两次?

时间:2009-02-01 01:17:52

标签: apache mod-rewrite url-rewriting

I only recently found out about URL rewriting,所以我还有很多需要学习的东西。

在关注Easy Mod Rewrite教程时,他们的一个示例的结果让我很困惑。

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

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

我认为副本可能是由我的主机配置中的某些内容引起的,但是XAMPP的干净安装也是如此。

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

而且,对我来说,这似乎是,如果它会这样做,那将是一个无限循环 - 为什么它会停止在2个周期?

2 个答案:

答案 0 :(得分:2)

来自this page的示例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 Archive,因为教程网站似乎处于脱机状态

答案 1 :(得分:2)

来自Apache Module mod_rewrite documentation

  

'last | L'(最后一条规则)
  [...]如果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]