首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

ASP.NET 404 錯誤頁面返回 302 狀態碼問題完美解決方案

     編輯:ASP.NET 基礎

問題背景

在 web.config 中設定 <customErrors> 導向自訂 404 頁面時,瀏覽器實際收到的 HTTP 狀態碼卻是 302 Found(重導向),而非預期的 404 Not Found。這對 SEO 極為不利:搜尋引擎會認為頁面仍存在,只是暫時重導向,導致錯誤頁面被索引、權重分散。

解決步驟

第一步:在 404.aspx 強制設定狀態碼

<%@ Page Language="C#" %>
<script runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
        Response.StatusCode = 404;
        Response.StatusDescription = "Not Found";
        // 或一行寫法:Response.Status = "404 Not Found";
    }
</script>

若專案未啟用 URL 重寫(偽靜態),此步驟通常已足夠。

第二步:處理 URL 重寫/偽靜態環境下的 302 殘留

啟用偽靜態(如 URL Rewrite、Wildcard Mapping)時,ASP.NET 管線會先重導向再執行 404.aspx,導致狀態碼被重置為 302。需在 Global.asax 中攔截 404 例外並使用 Server.Transfer 內部轉交,避免客戶端重導向。

protected void Application_Error(object sender, EventArgs e)
{
    FileNotFound_Error();
}

private void FileNotFound_Error()
{
    var httpEx = Server.GetLastError() as HttpException;
    if (httpEx != null && httpEx.GetHttpCode() == 404)
    {
        Server.ClearError();
        Server.Transfer("~/404.aspx"); // 內部轉交,URL 不變,狀態碼保持 404
    }
}

原理解析

  • Response.Redirect / customErrors redirect:發送 302 給瀏覽器,瀏覽器再請求新 URL → 狀態碼變 200。
  • Server.Transfer:伺服器端內部轉交,瀏覽器 URL 不變,原始請求的狀態碼可由目標頁面(404.aspx)覆寫為 404。
  • Server.ClearError():清除例外,避免觸發預設錯誤處理流程。

驗證方法

  1. 瀏覽器開發者工具 → Network 面板,請求一個不存在的 .aspx 頁面(如 /notexist.aspx)。
  2. 確認回應狀態碼為 404,且回應內容為自訂 404 頁面 HTML。
  3. 使用線上工具(如 httpstatus.io)檢測同一 URL,確保返回 404。

補充:完整 web.config 範例

<system.web>
  <customErrors mode="On" defaultRedirect="~/Error.aspx">
    <error statusCode="404" redirect="~/404.aspx" />
    <error statusCode="500" redirect="~/Error.aspx" />
  </customErrors>
</system.web>

<system.webServer>
  <httpErrors errorMode="Custom" existingResponse="Replace">
    <remove statusCode="404" />
    <error statusCode="404" path="/404.aspx" responseMode="ExecuteURL" />
  </httpErrors>
</system.webServer>

system.webServer/httpErrors 針對 IIS 7+ 管線模式下的靜態檔案、PHP 等非 ASP.NET 請求也能生效。

結語

結合 404.aspx 設定 Response.StatusCode = 404 與 Global.asax 使用 Server.Transfer,即可徹底解決 ASP.NET 404 頁面返回 302 的頑固問題,確保 SEO 友善與使用者體驗雙贏。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved