我在我的网站上设置了一个简单的mod_rewrite系统,它基本上转换了
http://site.com/file -> http://site.com/file.php
这是.htaccess文件
Options -MultiViews
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.site.com
RewriteRule ^(.*)$ http://site.com/$1 [R=301]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-z]+)/?$ http://site.com/$1.php [L]
这工作了很长时间,然后几天前我意识到当RewriteRule工作时,它实际上是在状态栏中更改我的URL。
例如,它会将/照片重定向到/photos.php,但它也会更改URL以显示.php。这种情况从未发生过,我不确定触发变化的情况。
有什么想法吗?
答案 0 :(得分:3)
第一个重写规则需要[L]标志。来自[R] flag的mod_rewrite文档:
您几乎总是希望将[R]与[L]结合使用(即使用[R,L]),因为[R]标志本身在
http://thishost[:thisport]
前面加上URI,但随后将其传递给规则集中的下一个规则,这通常会导致“请求中的URI无效”警告。
在这种情况下,您不会收到警告,但在发出重定向之前会附加“.php”扩展名,而不是在第二次重定向请求进入时。
此外,从第二次重写规则中的替换中删除方案和域名。完整的URL可能会导致隐式重定向。来自RewriteRule
的文档:
a的替换 重写规则是替换原始URL路径的字符串 与 Pattern 匹配。 替换可以 是一个:
[...]
- 绝对网址
- 如果指定了绝对URL, mod_rewrite检查是否有 hostname与当前主机匹配。如果是的话,该计划和 主机名被删除,结果路径被视为 一个URL路径。否则,执行外部重定向 给定的URL。强制外部重定向回到 当前主持人,请参阅下面的
[R]
标记。