2011-12-14 123 views
2

我使用Apache 2.2.X和PHP 5.2.X(作爲Apache模塊安裝)來構建新網站,我想閱讀您關於我如何處理服務器錯誤。
我正在考慮使用我的主頁(/index.php)的相同文件來顯示自定義錯誤消息。 這是我的.htaccess設置:現在Index.php as自定義錯誤頁面

ErrorDocument 400 /index.php?error=400 
ErrorDocument 401 /index.php?error=401 
ErrorDocument 403 /index.php?error=403 
ErrorDocument 404 /index.php?error=404 
ErrorDocument 500 /index.php?error=500 

,在我的index.php文件我有一些代碼,看起來像這樣:

if (isset($_GET['error'])) 
    DrawErrorPage($_GET['error']); 
else 
    DrawHomepage(); 

一切工作就像一個魅力。
好吧,除了一件我無法修復的東西之外的所有東西:如果我強制Apache使用500狀態碼進行響應(例如,將畸形代碼插入到我的.htaccess中),我沒有被重定向到「/index.php ?error = 500「,但我得到了默認的500錯誤頁面。使用任何其他狀態代碼(例如403或404),我的配置完全可以正常工作。

但現在我懷疑了,我開始認爲使用另一個頁面來處理錯誤會更好(例如,「/ error.php」)。
「DrawHomepage()」需要將「robots」元標記設置爲「index,follow」,而「DrawErrorPage()」需要將其設置爲「noindex,nofollow」。對?那麼......如果網絡抓取工具首次訪問我的主頁時出現錯誤響應,會發生什麼?如果一個網絡爬蟲第一次訪問我的主頁200次,但一個月後500次訪問它會發生什麼?如果我將我的「機器人」元標記保留爲「索引,跟蹤」,即使我顯示錯誤,會發生什麼?

對於這個問題,是否有解決方法?你會怎麼做?

非常感謝!

回答

4

通常,如果有一個5​​00個狀態碼,然後阿帕奇已經亂七八糟的東西了,並它不能運行你的index.php文件,導致另一 500狀態碼。在它最終表示「沒有更多循環」併發送自己的錯誤頁面之前,Apache繼續這個錯誤循環的幾次迭代。

顯示500狀態代碼的自定義頁面的唯一方法是使用純文本或使用基本的.html或.shtml文件,該文件不會嘗試訪問服務器上的其他內容,因此您不必在頁面加載中不會觸發更多的500個狀態代碼。

通常如果一個爬蟲遇到一個500,它會暫時忽略該頁面。一個500代碼是可以恢復的,它並不一定意味着那裏沒有頁面,只是這個服務器現在已經搞砸了。機器人很聰明,並且可以確定哪些錯誤代碼意味着什麼,只要頁面始終發送狀態碼在頁眉中。

記住,如果你使用PHP文件作爲錯誤文檔,則需要使用內部PHP頭功能,以確保正確的頁面檢測到重新發送HTTP狀態代碼,就像這樣:

header("HTTP/1.1 404 Page Not Found"); 
+1

好記約重發狀態碼。 – FakeRainBrigand 2011-12-14 01:10:29