1. ホーム
  2. c#

[解決済み] ASP.NET カスタム 404 は 404 Not Found の代わりに 200 OK を返します。

2023-06-14 09:03:57

質問

Google ウェブマスター ツール用にサイトをセットアップしようとした後、私のカスタム ASP.NET 404 ページが 404 ステータス コードを返さないことに気づきました。それは正しいカスタム ページを表示し、すべてが OK であることをブラウザに伝えました。これは、ソフト404または偽404とみなされます。Googleはこれを好まない。そこで、この問題に関する多くの記事を見つけましたが、私が望む解決策は機能していないようでした。

私が動作させたい解決策は、カスタム404ページのPage_Loadメソッドの後ろのコードに次の2行を追加することです。

Response.Status = "404 Not Found";
Response.StatusCode = 404;

これはうまくいきません。ページは依然として200 OKを返します。しかし、以下のコードをデザインコードにハードコードすると、正しく動作することがわかりました。

<asp:Content ID="ContentMain" ContentPlaceHolderID="ContentPlaceHolderMaster" runat="server">

<%
    Response.Status = "404 Not Found";
    Response.StatusCode = 404;
%>

 ... Much more code ...

</asp:content>

このページはマスターページを使用しています。そして、web.configでカスタムエラーページを構成しています。本当はコード ビハインド オプションを使用したいのですが、デザイン/レイアウトにハック インライン コードを置くことなく動作させることができないようです。

どのように解決するのですか?

解決方法です。

問題は、マスター ページの使用にあることが判明しました。ページのライフサイクルの後半でステータス コードを設定することで動作するようになりましたが、明らかにマスター ページのレンダリングによってリセットされていたので、レンダー メソッドをオーバーライドして、レンダリングが完了した後にそれを設定するようにしました。

protected override void Render(HtmlTextWriter writer)
{
    base.Render(writer);
    Response.StatusCode = 404;
}

マスターページがステータスを設定するタイミングを正確に知るために、もっと多くの作業を行うことができますが、それはあなたに任せます。


元記事です。

私はテスト Web アプリをうまく動作させることができました。少なくともカスタム エラー ページを表示し、404 ステータス コードを返しました。あなたのアプリの何が問題なのかを伝えることはできませんが、私が何をしたかを伝えることはできます。

1) カスタム エラー用の web.config を編集しました。

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

2) 404.aspxページを追加し、ステータスコードを404に設定します。

public partial class _04 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Response.StatusCode = 404;
    }
}

それはそれとして、もし私がAsp.Netによって処理され、存在しない任意のページ拡張に行くと、私のfiddlerログは明らかに404を示し、ここにヘッダがあります。

HTTP/1.1 404 Not Found
Server: Microsoft-IIS/5.1
Date: Sun, 07 Dec 2008 06:04:13 GMT
X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Length: 533

これで、Asp.Netで処理されないページ、例えばhtmファイルにアクセスすると、カスタムページは表示されず、IISで設定されている404が表示されるようになりました。

私のテストは新しいページにリダイレクトするので、要求されたファイルの URL はほとんど失われます (クエリ文字列の中にあることを除いて)。

Google 404 と .NET カスタム エラー ページ

ヘッダースパイレスポンス。

HTTP/1.1 404 Not Found
Date: Sun, 07 Dec 2008 06:21:20 GMT