2010-09-14 75 views
1

我有我通過路由所有請求的引導php文件:mod_rewrite鏈接?

RewriteRule ^(.*)$ index.php?query=$1 [L] 

說我有一個像/書籍網址/白鯨傢伙,但我需要的URL來傳遞給像/書籍的索引文件/細節/白鯨迪克。在最後一個RewriteRule之前,有沒有辦法「重寫」/ books/moby-dick到/ books/detail/moby-dick?我認爲Chain [C]旗會做到這一點,但我最終得到了「書/細節/ moby-dick/moby-dick」。這裏就是我目前堅持:

RewriteRule ^books/([A-Za-z0-9\-]+)$ books/detail/$1 [C] 
RewriteRule ^(.*)$ index.php?query=$1 [L] 

回答

1

您執行會自動流下後續規則在規則集前提是你不會導致進程結束/與L重新啓動(這通常任何重寫在.htaccess)或N標誌中使用時重新啓動。你可以刪除鏈接,它仍然能工作,但在這種情況下,你必須調理第二條規則:

RewriteRule ^books/([A-Za-z0-9\-]+)$ books/detail/$1 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ index.php?query=$1 [L] 

請注意,如果你鏈的規則一起,如果請求路徑不匹配第一條規則,請求不會被重定向到引導文件。

這些都不是實際問題的原因。會發生什麼是Apache已經決定請求具有路徑信息(出於我將不得不考慮的原因),並且在重寫之後它會自動將結果追加到結果中。假設的「路徑信息」是/moby-dick,這就是它出現兩次的原因。

幸運的是,既然我們不想要它,我們可以用DPI flag來丟棄它。記住以上幾點,下面將請求重定向到books/moby-dickindex.php?query=books/detail/moby-dick

RewriteRule ^books/([A-Za-z0-9\-]+)$ books/detail/$1 [DPI] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ index.php?query=$1 [L] 

(我讓你想books/detail/name的假設,雖然你也提到books/view/name

+0

DPI看起來像什麼,我一直在尋找。很好的答案! – typeoneerror 2010-09-15 00:39:26

0

在.htaccess規則(不像httpd.conf中的規則相同),[L]標誌全部從頂端開始。您可能確實想使用[END]標誌(但只有​​更高版本的Apache支持它)。我相信你重複更改的原因與[C]標誌無關,而是因爲該行正在執行兩次。 (事實上​​,唯一能讓你從「無限循環」中解脫出來的是你的「-f」測試最終會停止)。

在.htaccess文件中的每個修改都是總是「傳遞」到下一行(沒有用於啓用或禁用此行爲的標誌)。使用不多的[C]標誌似乎主要用於嵌套條件和非常簡單的一些尷尬的if-then-else結構,在這個例子中你都沒有這樣做。這就是爲什麼我不明白你完全需要[C]標誌。

的標準技術,以避免大規模的循環和老年.htaccess文件重複的問題是要在頂部加了一點的樣板,像

RewriteCond %{ENV:REDIRECT_STATUS} !^[ /]*$ 
RewriteRule^- [L]