2011-09-06 70 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