2010-09-09 78 views
4

這似乎很簡單,但我無法弄清楚......我想所有的請求被重寫爲index.php(它將解釋請求)除了 404.html這應該被直接改寫爲404.php。簡單的重寫規則問題

下面的代碼在將所有內容重寫爲index.php時都有效,但是404.php永遠不會被觸發。

我已經留下第3行評論,因爲我不知道它是幹什麼的。

Options +FollowSymlinks 
RewriteEngine on 
#RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^404.html$ 404.php [L] 
RewriteRule ^(.*)$ index.php [QSA] 

正如您所見,我的需求非常簡單,但我的大腦也是如此!請幫忙!

謝謝。

編輯

這條線工作在自己的罰款:

RewriteRule ^404.html$ 404.php 

,而是引入了其他重寫規則的時候,一切都被通過的index.php強制 - 甚至404.html .... ..(我也嘗試改變順序)。

+1

第三行表示'以下規則僅適用於所請求的文件名不是現有文件的情況。 (-f是一個文件,-d是一個目錄,等等) – 2010-09-09 11:35:14

回答

0

這讓我開車MAD!但我找到了答案,對於那些像我一樣感到困惑的人。

看行4:easymodrewrite

Options +FollowSymlinks 
RewriteEngine on 
RewriteRule ^404.html$ 404.php [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ index.php 

來自

的[L]標誌可以有意想不到的效果,如果你不是在模塊的行爲明確。請注意,以下內容僅適用於在.htaccess文件中使用mod_rewrite的情況。使用httpd.conf時,[L]標誌的行爲與預期完全相同。

L標誌將告訴Apache停止處理該請求的重寫規則。現在通常沒有意識到的是,它現在對新的重新編寫的文件名提出新的請求,並且再次開始處理重寫規則。


基本上,你必須告訴第二條規則不要匹配現有的文件(404.php是一個真實的文件,而不是動態的)。

希望這可以幫助別人。

1

你可以用!來反轉匹配結果。所以:

RewriteRule ^404\.html$ 404.php 
RewriteRule !^404\.html$ index.php [QSA] 

這將匹配的路徑通過^404\.html$匹配的任何請求。

您可能需要補充的是被註釋掉的條件:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule !^404\.html$ index.php [QSA] 

現在,如果該請求可以額外不能被映射到一個現有的文件該規則將只匹配。

+0

我不明白這是如何幫助的 - 我希望404.html被重寫爲404.php ...和其他一切index.php與請求者作爲查詢字符串。 – Greg 2010-09-09 11:28:24

+0

@Greg:修正了這個問題。 – Gumbo 2010-09-09 11:30:20

+0

嗯,使用你放什麼,請求404.html仍然被定向到index.php ...我做錯了什麼? – Greg 2010-09-09 11:37:39

0

我建議這個解決方案:

Options +FollowSymlinks 
RewriteEngine on 
#RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^404.html$ 404.php [L] 
RewriteRule ^(.*)$ index.php [QSA] 

我認爲問題是,你重寫URL到404.php,然後將其發送到index.php。在第一條規則之後放置[L]將指示重寫引擎不繼續重寫。

+0

訪問404.html仍然通過index.php重定向!我錯過了什麼? – Greg 2010-09-09 11:48:06