2011-09-25 37 views
2

我有一個自定義的404錯誤頁面和一個mod_rewrite規則。如果我訪問一個不存在的頁面,我會看到我的404錯誤頁面。我的問題是,如果我發出了從我的PHP頁面404頭,開不開我的404頁,相反,我得到這個:apache mod_rewrite和404頁的問題

Not Found 

The requested URL /index.php was not found on this server. 

Additionally, a 404 Not Found error was encountered while trying 
to use an ErrorDocument to handle the request. 

這是我的.htaccess:

RewriteEngine on 
ErrorDocument 404 /errors/404.php 
RewriteRule ^[A-Za-z0-9]{8}/$ /index.php 

這是我從/index.php重定向,只有在密鑰不存在時纔會404。 $ key則是從解析URL(例如http://localhost/aKeYCoDE/)獲得:

<?php 
if (!key_exists($key)){ 
    header('HTTP/1.0 404 Not Found'); 
    exit; 
} 
?> 

我希望它重定向到我的404頁。

UPDATE:

這是肯定一些有關的事實,我從被改寫網頁(的index.php)呼叫404。如果我創建一個虛擬頁面:/redirect.php,然後什麼也不做,但從那裏發出404,我得到我的自定義404頁面。但是,如果我爲它編寫mod_rewrite規則,並嘗試以這種方式訪問​​它,我會得到默認的404錯誤頁面。

+0

聽起來好像找不到你的404.php。你確定它存在嗎?您也可以嘗試文件的完整URL路徑。 –

+0

/errors/404.php肯定存在。我可以直接訪問它,如果我訪問一個不存在的文件,我會得到它。我不明白的是,如果我從我的PHP頁面(重寫的/index.php)執行404重定向,我會得到默認的錯誤頁面,而不是我自己的。 – Blazes

+0

我同意你的回答,下面給出的答案(來自PHP的404狀態響應不會觸發你的Apache ErrorDocument)。但是,對您的問題的更新似乎與此相矛盾......「如果我創建了一個虛擬頁面:/redirect.php,然後什麼都不做,只能從那裏發出404,我得到了我的自定義404頁面。」 ? – MrWhite

回答

2

我找到了答案 - 問題是我的假設,PHP的頭404將重定向到404頁。那是錯誤的。 Apache服務器可以針對不存在的頁面發佈404,但對於存在的頁面(即正在由php頁面提供服務),404響應會轉到瀏覽器。

這個線程是一個類似的問題: http://www.webmasterworld.com/forum88/10955.htm

使PHP做我想做的事情(發行404時,關鍵不存在),我需要從PHP的包括404頁:

<?php 
if (!key_exists($key)){ 
    include($_SERVER["DOCUMENT_ROOT"]."/errors/404.php"); 
    exit; 
} 
?>