2009-02-01 58 views
1

I only recently found out about URL rewriting,所以我还有很多东西要学。为什么mod_rewrite会重写两次?

虽然遵循Easy Mod Rewrite教程,但其中一个示例的结果令我感到困惑。

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

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

我想重复可能是由我的主机的配置中的东西造成的,但干净的安装XAMPP也是如此。

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

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

回答

2

从实例1的this page,这是你的问题的链接部分教程:

假设你正在使用的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文件保存在同一目录中,即使用-f,使用RewriteCond检查文件是否存在。


链接是互联网档案馆,因为本教程的网站显示为脱机

+0

链接带来一个网站,不再工作 – 2015-02-18 23:13:34

2

Apache Module mod_rewrite documentation

'最后| L'(最后规则)
[...]如果RewriteRule产生一个内部重定向,这将reinjec t的请求,并会导致处理从第一个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]