2010-11-29 119 views
8

在我的asp.net網站中,我的自定義錯誤頁面定義如下在我的web.config文件中。ASP.NET的404自定義錯誤頁面返回302狀態爲http狀態

<customErrors mode="On" defaultRedirect="~/defaulterror.htm" > 
<error statusCode="404" redirect="~/404.htm" /> 

當文件沒有找到正確顯示404.htm頁面,但問題是,當我做小提琴手跟蹤它返回302 HTTP狀態代碼。此是搜索引擎頁面的索引一個大問題,由於這個地段由於這個在我的網站中最近被破壞的鏈接仍然被索引。我怎樣才能防止返回302作爲HTTP狀態代碼文件未找到錯誤,並返回404文件未找到errors.I使用asp.net 3.5。

+1

參見[此帖](http://stackoverflow.com/questions/619895/how-can-i-properly-handle-404 -in-asp-net-mvc/7967759#7967759),這是一個使用ASP.Net MVC篩選器屬性的自定義404錯誤頁面解決方案的示例。該解決方案還避免了302/200消息到瀏覽器。瀏覽器得到一個404響應。 – 2011-11-01 14:16:50

回答

15

在谷歌搜索這個問題後,似乎這是Microsoft ASP.NET爲這種情況提供的默認行爲。這對搜索引擎優化非常不利。圍繞我發現了一個工作是檢查請求的文件是否在HTTP處理程序存在(或Global.asax文件),或使用:

<customErrors mode="On" redirectMode="ResponseRewrite"> 
    <error statusCode="404" redirect="/FileNotFound.aspx" /> 
</customErrors> 

如果請求的文件不存在,則改寫請求路徑到文件未找到頁面(如果使用HTTP處理程序或global.asax),請清除404錯誤頁面代碼後面的服務器錯誤,並手動向響應添加404錯誤標題,而不是等待服務器執行此操作。

Server.ClearError(); 
Response.Status = "404 Not Found"; 
Response.StatusCode = 404; 
+0

至少在.NET FW 4.0中添加了redirectMode屬性! – 2011-03-29 19:16:20

+0

這是完美的。該URL保持在同一頁面上,但現在我得到了正確的404狀態碼。 – kd7iwp 2012-05-17 20:57:14

0

正如您可能已經知道302響應用於通知調用者所請求的資源已被移到不同的位置。

當你看到,在Fiddler中,返回的302 http代碼在頭部還有一個'位置'聲明?例如:

HTTP/1.1 302 Found 
Location: http://www.yoursite.com/somewhere/blah.htm 

看來你可能在網絡服務器上有'東西',它攔截404返回並用302代替它們。我知道這並不多,但我建議您查看該站點的IIS配置。

2

在ASP.NET 4.0中,您可以使用redirectMode="ResponseRewrite"發送友好的錯誤頁面和正確的HTTP代碼。

0

如果將以下內容添加到您的404頁面代碼後面。你會得到正確的結果 -

頁404.aspx

protected void Page_Load(object sender, EventArgs e) 
{ 
    Response.StatusCode = 404; 
}