* Обновлено апрель 2016 г.
Атрибут customErrors используется, когда код .net вызывает исключение (404, 403, 500 и т. Д.), А атрибут httpErrors используется, когда сам IIS выбрасываетисключение.
- / myfakeextensionslessurl -> httpErrors 404
- / myfakeaspsx.aspx -> customErrors 404
- / myfakeimage.jpg -> httpErrors404
- / throw500.apx -> customErrors 500
- / throw500 -> customErrors 500
Существует множество ловушек, пытающихся настроить это правильно.Так что, если вы ищете быстрый пример, лучшие 2 варианта у вас есть:
Пример 1. Использование html-страниц
<system.web>
<customErrors mode="RemoteOnly" defaultRedirect="/Error500.html" redirectMode="ResponseRewrite">
<error statusCode="403" redirect="/Error403.html" />
<error statusCode="404" redirect="/Error404.html" />
<error statusCode="500" redirect="/Error500.html" />
</customErrors>
</system.web>
<system.webServer>
<httpErrors errorMode="DetailedLocalOnly" existingResponse="Auto">
<remove statusCode="403" />
<remove statusCode="404" />
<remove statusCode="500" />
<error statusCode="403" responseMode="File" path="Error403.html" />
<error statusCode="404" responseMode="File" path="Error404.html" />
<error statusCode="500" responseMode="File" path="Error500.html" />
</httpErrors>
</system.webServer>
Пример 2. Использование aspx-страниц
<system.web>
<customErrors mode="RemoteOnly" defaultRedirect="/Error500.html" redirectMode="ResponseRewrite">
<error statusCode="403" redirect="/Error403.aspx" />
<error statusCode="404" redirect="/Error404.aspx" />
<error statusCode="500" redirect="/Error500.aspx" />
</customErrors>
</system.web>
<system.webServer>
<httpErrors errorMode="DetailedLocalOnly" existingResponse="Auto">
<remove statusCode="403" />
<remove statusCode="404" />
<remove statusCode="500" />
<error statusCode="403" responseMode="ExecuteURL" path="Error403.aspx" />
<error statusCode="404" responseMode="ExecuteURL" path="Error404.aspx" />
<error statusCode="500" responseMode="ExecuteURL" path="Error500.aspx" />
</httpErrors>
</system.webServer>
А на страницах с ошибками aspx вам нужно сделать что-то вроде этого (пример страницы 404):
<%
Response.StatusCode = 404;
Response.TrySkipIisCustomErrors = true;
%>
Примечание. Использование расширений less url в разделе customErrors равно notвозможно! . (без хаков)
Одно из возможных решений - отключить пользовательские ошибки и разрешить ошибкам http обрабатывать пользовательскую страницу.Друг создал такую настройку, когда я найду время, я поделюсь кодом.
Фон
Хорошая пользовательская страница ошибки будет:
- Показать реальное исключение при локальном посещении страницы проблемы
- Показать пользовательскую страницу при удаленном посещении страницы проблемы
- Не будет перенаправлять, а просто отобразить содержимое страницы ошибки (по причинам SEO)
- Покажет правильный код состояния
Итак, чтобы уточнить некоторые параметры в нашей конфигурации:
<customErrors mode="RemoteOnly"
,Вы можете указать здесь: On
, Off
, RemoteOnly
.
On
= Всегда показывать пользовательские страницы ошибок Off
= Всегда показывать реальную ошибку RemoteOnly
= Показывать ошибку локально, но показывать страницу с пользовательской ошибкой удаленно.Поэтому мы хотим RemoteOnly
для выписки 1
<customErrors redirectMode="ResponseRewrite"
.Вы можете указать здесь: ResponseRedirect
или ResponseRewrite
.Режим ResponseRedirect
перенаправит страницу ошибки на страницу пользовательской ошибки.Для сканера ссылок (SEO) это приведет к 302 -> 500, но вы хотите, чтобы сканер ссылок получил ошибку 500.
<httpErrors errorMode="DetailedLocalOnly"
.Это эквивалент режима customErrors
.У вас есть варианты: Custom
, Detailed
, DetailedLocalOnly
.
Хорошая запись в блоге, которая мне очень помогла: http://benfoster.io/blog/aspnet-mvc-custom-error-pages