2012-08-14 45 views
3

我想重定向在URL中使用了錯誤的查詢字符串,以自定義錯誤頁,同時通過的.htaccess指令如何重定向錯誤的查詢字符串定製的errorPage + 404狀態

ErrorDocument 404 http://www.domain.com/404.php 
給予404種狀態的用戶

編輯:這不給404但302! 「http://www.domain.com」 導致重定向。就在本地路徑給出了404又見http://httpd.apache.org/docs/2.0/mod/core.html#errordocument

因此我決定,如果查詢字符串是無效的,如果因此請求接收的index.php做了一個腳本,給出了這樣的命令:

header("HTTP/1.0 404 Not Found"); 

但是這不通過.htaccess指令ErrorDocument重定向,但只是給訪問者一個404狀態。

當使用header("Location: 404.php")時,您將獲得302狀態,使用header("Location: 404.php", true, 404)時,狀態爲404,但不會轉到自定義404.php頁面。

現在我用

header ("Location: ", true, 404); 
echo "The URL you use doesn't lead to an existing page, etc."; 

但是,這不是原來的計劃......我怎麼會提出這樣在URL中使用了錯誤的查詢字符串將用戶重定向到自定義錯誤頁,同時還通過給404個狀態.htaccess指令ErrorDocument,或者這是不可能的?

回答

4

據我所知,從PHP顯示404頁面的唯一方法是明確重定向到它。原因是Apache(或者你正在使用的任何Web服務器)已經成功定位了一個指向客戶端的資源(正在執行的PHP腳本)。如果PHP腳本無法解析客戶端的請求,那麼它必須處理髮送404頭並顯示頁面本身。

你既可以重定向

header ("HTTP/1.0 404 Not Found"); 
header ('Location: http://' . $_SERVER["SERVER_NAME"] . '/404.php'); 

或者你也可以包括404頁轉換成想要觸發404

header ("HTTP/1.0 404 Not Found"); 
include ('/path/to/404.php'); 

編輯的PHP腳本:如果使用第一種方法(重定向),並希望將$ _GET傳遞給腳本,以便確定它有什麼問題,您可以執行此操作。

header ("HTTP/1.0 404 Not Found"); 
header ('Location: http://' . $_SERVER["SERVER_NAME"] . '/404.php?' . http_build_query ($_GET)); 

如果包含404.php文件,然後在$ _GET將提供給它已經

+0

實際上,你可以使用重寫規則返回[R = 404],就像您301/302在htaccess中重定向,但它聽起來像無效的查詢字符串邏輯最好在PHP中處理。但是,如果在htaccess中正確定義(並允許)ErrorDocument 404,則PHP 404頭應該足以顯示在htaccess中指向的自定義錯誤頁ErrorDocument – WebChemist 2012-08-14 06:46:11

+0

我剛剛嘗試確保PHP不會重定向到404頁如果你只是發送一個404頭。你必須自己處理它。 – GordonM 2012-08-14 07:10:37

+0

我懷疑我的計劃是不可能的,因爲.htaccess沒有被請求再次傳遞,因爲資源通過正在執行的PHP腳本來定位。你最後的建議對我來說看起來不錯,但是當我查看access.log時,狀態不是404而是302,它只是跳過它看起來的第一個標題命令。 @webchemist:在.htaccess中,我無法檢查查詢字符串是否有效,因爲頁面來自數據庫,並且.htaccess中的正則表達式無法通過檢索要比較的正確值來構建。 – 2012-08-14 07:30:05

1

一個替代的解決方案,以顯示自定義的404頁面,並使用頁眉刷新獲取狀態404:

header("refresh:0;url=/404.php",TRUE,404); 

但這不是標準行爲,因爲您實際上是將用戶重定向到www.domain.com/404.php,而不是在不良網址下顯示404頁面(如www.domain.com/index.php?q= badrequest)就像Apache ErrorDocument一樣,儘管我不確定這對搜索引擎是否有影響由於原始網址仍然返回404響應,因此piders ...

而且對任何人碰到這個奇怪的到來大約在戈登的答覆意見中提到的htaccess的404重定向,你會使用這樣的:

RewriteRule ^(match conditions)$ - [R=404,NC,L]