2011-09-06 81 views
2

我有一个简单的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。这从来没有发生过,我不确定发生了什么事情触发了变化。

任何想法?

回答

3

第一个重写规则需要[L]标志。从为[R] flag mod_rewrite的文档:

你将几乎总是需要结合使用[R]与[L](即使用[R,L]),因为对自己的[R]标志将前缀http://thishost[:thisport]添加到URI,但随后将其传递到规则集中的下一个规则,这通常会导致“请求中的URI无效”警告。

在这种情况下,你没有得到警告,但追加“.php”结尾发出重定向,而不是当第二,重定向请求到来之前发生。

而且,除去方案和域名从第二个重写规则中的替换。完整的URL可能导致隐式重定向。从文档RewriteRule:一个 重写规则的

换人是,它取代了原来的URL路径是 被模式匹配的字符串。该换人可以 是:

[...]
绝对URL
如果指定一个绝对URL, mod_rewrite检查看 主机名是否与当前的主机相匹配。如果是这样,该方案和 主机名将被剥离出来,并将生成的路径视为 URL路径。否则,将为给定的URL执行外部重定向 。要强制外部重定向回 当前主机,请参阅下面的 [R]标志。
+0

这似乎是一个坚实的解决方案,但在这里不是正确的:\我知道,改写越来越到文件 - > file.php行,我行搞砸验证(即我更改$ 1.php为$ 1.php?foo = bar,然后http://site.com/file更改为http://site.com/file.php?foo=bar) – jchmski

+0

是的,第二个解决方案做到了!非常感谢我欣赏它! – jchmski

+0

请注意,您需要采取两个步骤来防止实际URL泄漏。另外,考虑选择一个有意义的[StackOverflow名称](http://tinyurl.com/so-hints),以便其他人可以使用[at-replies](http://meta.stackexchange。COM /问题/ 43019 /怎么办,评论,回复工作)。 – outis