標準のASP.NET Webアプリケーションに404ページを実装する最適な方法を決定しようとしています。現在、Global.asaxファイルのApplication_Errorイベントで404エラーをキャッチし、わかりやすい404.aspxページにリダイレクトします。問題は、リクエストが302リダイレクトに続いて404ページが欠落していることです。リダイレクトをバイパスし、フレンドリーなエラーメッセージを含む即時404で応答する方法はありますか?
GooglebotなどのWebクローラーは、存在しないページのリクエストが302に続いて404を返すかどうかを気にしますか?
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ステータスコードを尊重します。したがって、エラーページで必ずそれを返す必要があります。
Web.configを使用して、404エラーをカスタムページに送信できます。
<customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
<error statusCode="403" redirect="NoAccess.htm" />
<error statusCode="404" redirect="FileNotFound.htm" />
</customErrors>
私はこのアプローチが本当に好きです。すべてのエラータイプを処理する単一のビューを作成し、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
また、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" }
);
最も簡単な答え:コードでそれをしないでください configure IIS代わりに 。
Web.configで404ページを設定するのはナイスクリーンメソッドであることがわかりますが、それでも最初はエラーページへの302リダイレクトで応答します。例として、次の場所に移動すると:
https://stackoverflow.com/x.aspx
302リダイレクトを介して以下にリダイレクトされます。
https://stackoverflow.com/404?aspxerrorpath=/x.aspx
私がやりたいのはこれです:
リダイレクトはありません。欠落しているURLの要求は、わかりやすいエラーメッセージとともに404ステータスコードを返します。
これはどこでも使用しますか?
Response.Status="404 Page Not Found"
IIS自体を構成して、任意のタイプのHTTPエラー(404を含む)に応答して特定のページを返すことができます。
以下のようにweb.configでカスタムエラーコンストラクトを使用するのが最善の方法だと思います。これにより、さまざまなHTTPコードすべてを簡単で効果的な方法で処理するためにページを接続できます。
<customErrors mode="On" defaultRedirect="~/500.aspx">
<error statusCode="404" redirect="~/404.aspx" />
<error statusCode="500" redirect="~/500.aspx" />
</customErrors>