我的mod_rewrite发生了什么?

时间:2011-09-06 03:54:50

标签: apache .htaccess mod-rewrite

我在我的网站上设置了一个简单的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。这种情况从未发生过,我不确定触发变化的情况。

有什么想法吗?

1 个答案:

答案 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]标记。