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个周期?
答案 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]