37

標準の ASP.NET Web アプリケーションに 404 ページを実装する最善の方法を決定しようとしています。現在、Global.asax ファイルの Application_Error イベントで 404 エラーをキャッチし、わかりやすい 404.aspx ページにリダイレクトしています。問題は、リクエストで 302 リダイレクトに続いて 404 ページが見つからないことです。リダイレクトをバイパスし、わかりやすいエラー メッセージを含む 404 で即座に応答する方法はありますか?

Googlebot などの Web クローラーは、存在しないページへのリクエストで 302 に続いて 404 が返されても気にしますか?

4

9 に答える 9

48

Global.asax の OnError イベントでこれを処理します。

protected void Application_Error(object sender, EventArgs e){
  // An error has occured on a .Net page.
  var serverError = Server.GetLastError() as HttpException;

  if (serverError != null){
    if (serverError.GetHttpCode() == 404){
      Server.ClearError();
      Server.Transfer("/Errors/404.aspx");
    }
  }
}

エラー ページで、ステータス コードを正しく設定していることを確認する必要があります。

// If you're running under IIS 7 in Integrated mode set use this line to override
// IIS errors:
Response.TrySkipIisCustomErrors = true;

// Set status code and message; you could also use the HttpStatusCode enum:
// System.Net.HttpStatusCode.NotFound
Response.StatusCode = 404;
Response.StatusDescription = "Page not found";

ここでは、他のさまざまなエラー コードも適切に処理できます。

通常、Google は 302 に従い、次に 404 ステータス コードを受け入れます。そのため、エラー ページでそれを返すようにする必要があります。

于 2009-03-20T20:36:26.557 に答える
15

web.config を使用して、404 エラーをカスタム ページに送信できます。

    <customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
        <error statusCode="403" redirect="NoAccess.htm" />
        <error statusCode="404" redirect="FileNotFound.htm" />
    </customErrors>
于 2009-03-20T17:05:24.130 に答える
3

最も簡単な答え: コードではなく、代わりに IIS を構成します。

于 2009-03-20T17:06:34.503 に答える
3

また、404 ではなく 302 にも直面しました。次のようにして修正できました。

コントローラ:

public ViewResult Display404NotFoundPage()
        {
            Response.StatusCode = 404;  // this line fixed it.

            return View();
        }

意見:

ユーザーにいくつかのエラー メッセージを表示します。

web.config:

<customErrors mode="On"  redirectMode="ResponseRedirect">
      <error statusCode="404" redirect="~/404NotFound/" />
</customErrors>

最後に、RouthConfig:

routes.MapRoute(
             name: "ErrorPage",
             url: "404NotFound/",
             defaults: new { controller = "Pages", action = "Display404NotFoundPage" }
         );
于 2014-02-25T11:28:04.523 に答える
3

私はこのアプローチがとても気に入っています。すべてのエラー タイプを処理する単一のビューを作成し、IIS をオーバーライドします。

[1]: Web.config からすべての「customErrors」と「httpErrors」を削除します

[2]: 「App_Start/FilterConfig.cs」が次のようになっていることを確認します。

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
    }
}

[3]: 「Global.asax」に次のメソッドを追加します。

public void Application_Error(Object sender, EventArgs e)
{
    Exception exception = Server.GetLastError();
    Server.ClearError();

    var routeData = new RouteData();
    routeData.Values.Add("controller", "ErrorPage");
    routeData.Values.Add("action", "Error");
    routeData.Values.Add("exception", exception);

    if (exception.GetType() == typeof(HttpException))
    {
        routeData.Values.Add("statusCode", ((HttpException)exception).GetHttpCode());
    }
    else
    {
        routeData.Values.Add("statusCode", 500);
    }

    Response.TrySkipIisCustomErrors = true;
    IController controller = new ErrorPageController();
    controller.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
    Response.End();
}

[4]: 「Controllers/ErrorPageController.cs」を追加

public class ErrorPageController : Controller
{
    public ActionResult Error(int statusCode, Exception exception)
    {
        Response.StatusCode = statusCode;
        ViewBag.StatusCode = statusCode + " Error";
        return View();
    }
}

[5]: 'Views/Shared/Error.cshtml' 内

@model System.Web.Mvc.HandleErrorInfo
@{
    ViewBag.Title = (!String.IsNullOrEmpty(ViewBag.StatusCode)) ? ViewBag.StatusCode : "500 Error";
}

 <h1 class="error">@(!String.IsNullOrEmpty(ViewBag.StatusCode) ? ViewBag.StatusCode : "500 Error"):</h1>


//@Model.ActionName
//@Model.ContollerName
//@Model.Exception.Message
//@Model.Exception.StackTrace

:D

于 2015-04-18T01:32:53.887 に答える
2

web.configで404ページを設定するのは良い方法ですが、それでも最初はエラーページへの302リダイレクトで応答します。例として、次の場所に移動した場合:

https://stackoverflow.com/x.aspx

302リダイレクトを介して次の場所にリダイレクトされます。

https://stackoverflow.com/404?aspxerrorpath=/x.aspx

私がしたいのはこれです:

http://www.cnn.com/x.aspx

リダイレクトはありません。欠落しているURLをリクエストすると、わかりやすいエラーメッセージとともに404ステータスコードが返されます。

于 2009-03-20T17:38:48.967 に答える
2

これってどこかで使ってますか?

 Response.Status="404 Page Not Found"
于 2009-03-20T17:06:47.153 に答える
0

最善の方法は、以下のように web.config でカスタム エラー コンストラクトを使用することだと思います。これにより、さまざまな HTTP コードをすべて簡単に効果的な方法で処理するようにページを接続できます。

  <customErrors mode="On" defaultRedirect="~/500.aspx">
     <error statusCode="404" redirect="~/404.aspx" />
     <error statusCode="500" redirect="~/500.aspx" />
  </customErrors>
于 2009-03-20T17:09:08.303 に答える
0

任意のタイプの http エラー (404 を含む) に応答して特定のページを返すように IIS 自体を構成できます。

于 2009-03-20T17:05:06.940 に答える