web-dev-qa-db-ja.com

「独自の」404カスタムページを返す方法

私のWebサイトでエラーが発生した場合は、次のようにします。

        Server.Transfer("/error.aspx");

そしてそのページにはコードがあります:

protected void Page_Load(object sender, EventArgs e)
{
    ...

    Response.StatusCode = 404;
}

ローカルホストで作業すると、ページに返される404ステータスとともに、ページに「適切なエラーの説明」が表示されます。

同じコードをインターネットに公開した後も、エラーのあるすべてのページには404ステータスコードが表示されますが、コンテンツはありません。代わりに、標準の404エラーメッセージが表示されます。

404 - ファイルまたはディレクトリが見つかりません。

「Response.StatusCode = 404」という行がコメント化されている場合、適切なページが提供されますが、ステータスコードは200です。

質問: 404エラーステータスコードを含むユーザーフレンドリーなエラーページを返す方法は?

どんな考えでも大歓迎です!よろしくお願いします!

追伸ASP.NET 4.0

17
Budda
<customErrors mode="On" defaultRedirect="~/Error/GenericErrorPage.aspx">

     <error statusCode="404" redirect="~/Error/404.aspx" />

</customErrors>

http://msdn.Microsoft.com/en-us/library/h0hfz6fc(v = vs.71).aspx

http://msdn.Microsoft.com/en-us/library/aa479319.aspx

15
adt

はは!

これを試して:

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

ステータスコードを設定する前にResponse.TrySkipIisCustomErrors=trueを追加するとすぐに、通常のページコピーが表示され、404が返されます。この行がないと、標準のIIS 404ページが表示されます。

または、これは次のようにweb.configで設定できます。

<system.webServer>
    <httpErrors existingResponse="PassThrough">
        // custom error page mappings
    </httpErrors>
</system.webServer>

ここで重要なのはexistingResponse="PassThrough"です

これはIIS7に追加されたため、統合パイプラインモードで実行されているサイトで必要です。

詳細情報: http://msdn.Microsoft.com/en-us/library/system.web.httpresponse.tryskipiiscustomerrors.aspx

更新明確化のために更新しています/人々はまだこれが有用であると感じているため、詳細情報を提供しています。シンプルで汎用的な404ページが必要な場合は、web.configメソッドを使用してください(プレーンHTMLページにすることをお勧めします)。

私が説明する方法は、特定のページが404を返す可能性がある非常に動的なサイトまたはCMS駆動型のサイトがあるが、訪問者関連情報を表示したい場合に最適です。

たとえば、特別オファーページ(offers/some-offer)はオファー(some-offer)のルックアップを行い、それが存在しない場合は、ボンネットの下に404を返すときに代替または関連オファーを表示できます。訪問者が知る限り、オファーはもう利用できないと言われましたが、オファーセクションにありますが、ロボットにURLのインデックスを解除するように指示しています。一般的な404ページが1つしかない場合、これははるかに難しくなります。

12
Jag

これは、web.configファイルを構成することで実現できます。ページの下部にあるHTTPエラーステータスごとに異なるカスタムエラーページを表示する方法について説明している記事への以下のリンクを確認してください。

6
utsikko

自分のページ正しい404ステータスコードを表示するには、次のコードを使用できます。

1)web.configに以下を追加します。

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

そして:

<httpErrors errorMode="Custom">
  <remove statusCode="404"/>
  <error statusCode="404" path="404.htm" responseMode="File"/>
</httpErrors>

2)404.htmファイルをWebサイトのrootに追加します。

<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>404 - Not Found</title>
    <meta http-equiv="refresh" content="5;url=/404-PAGE" />
  </head>
  <body>
       CONTENT
  </body>
</html>

このファイルの本文にコンテンツを追加してメタリフレッシュを削除するか、メタリフレッシュを使用してCMS内のページを開くことができます。

3
Menderes

Jagとadtの答えを組み合わせると、まだ問題がありました。 (ASP.NETではなく)静的ファイルハンドラーによって404が処理されたときに、空の応答が返されました。 (ステータスは正しく404でした。)

これを修正するには、errorMode="Custom"要素に<httpErrors>を追加する必要がありました。エラーページでASP.NETを使用している場合は、responseMode="ExecuteURL"を含める必要があります。

<system.web>
    <customErrors mode="On" defaultRedirect="~/Error.aspx" redirectMode="ResponseRewrite" />
</system.web>

<system.webServer>
    <httpErrors errorMode="Custom">
        <remove statusCode="404" />
        <error statusCode="404" path="/Error.aspx" responseMode="ExecuteURL" />
    </httpErrors>
</system.webServer>
2
mm201
<httpErrors errorMode="Custom">
     <remove statusCode="404"/>
     <error statusCode="404" path="ErrorPages/error404.htm" responseMode="Redirect"/>
  </httpErrors>

これは、パス属性でチルダ(~)を使用しない場合に機能します

1
A.moizRiaz