2009-02-01 57 views
1

I only recently found out about URL rewriting,所以我還有很多東西要學。爲什麼mod_rewrite會重寫兩次?

雖然遵循Easy Mod Rewrite教程,但其中一個示例的結果令我感到困惑。

RewriteBase/
RewriteRule (.*) index.php?page=$1 [QSA,L] 

重複寫/home/index.php?page=index.php&page=home

我想重複可能是由我的主機的配置中的東西造成的,但乾淨的安裝XAMPP也是如此。

那麼,有沒有人知道爲什麼這似乎解析兩次?

對我來說,這似乎是,如果要這樣做,這將是一個無限循環 - 爲什麼它停在2個週期?

回答

2

從實例1的this page,這是你的問題的鏈接部分教程:

假設你正在使用的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文件保存在同一目錄中,即使用-f,使用RewriteCond檢查文件是否存在。


鏈接是互聯網檔案館,因爲本教程的網站顯示爲脫機

+0

鏈接帶來一個網站,不再工作 – 2015-02-18 23:13:34

2

Apache Module mod_rewrite documentation

'最後| L'(最後規則)
[...]如果RewriteRule產生一個內部重定向,這將reinjec t的請求,並會導致處理從第一個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]