web-dev-qa-db-ja.com

ASP.NETで404を実装する最良の方法

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

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

35
Ben Mills

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ステータスコードを尊重します。したがって、エラーページで必ずそれを返す必要があります。

43

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

    <customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
        <error statusCode="403" redirect="NoAccess.htm" />
        <error statusCode="404" redirect="FileNotFound.htm" />
    </customErrors>
14
Robin Day

私はこのアプローチが本当に好きです。すべてのエラータイプを処理する単一のビューを作成し、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

3
ubik404

また、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" }
         );
3
Eyal

最も簡単な答え:コードでそれをしないでください configure IIS代わりに

3
Pontus Gagge

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ステータスコードを返します。

2
Ben Mills

これはどこでも使用しますか?

 Response.Status="404 Page Not Found"
2
inspite

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

0
Assaf Lavie

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

  <customErrors mode="On" defaultRedirect="~/500.aspx">
     <error statusCode="404" redirect="~/404.aspx" />
     <error statusCode="500" redirect="~/500.aspx" />
  </customErrors>
0
James