В чем разница между customErrors и httpErrors?
-
21-09-2019 - |
Вопрос
В чем разница между customErrors
и httpErrors
разделы файла web.config в ASP.NET Приложениях MVC?
Каковы рекомендации по использованию каждого раздела?
Решение
Отказ от ответственности:Это из моего опыта и не доказанный факт.
Оба используются для определения обработки ошибок для веб-сайта, но разные программы ссылаются на разные элементы конфигурации.
customErrors
являются устаревшим (с обратной совместимостью) элементом, используемым Visual Studio Development Server (он же.VSD или Cassini).
httpErrors
являются новым элементом, который используется только IIS7.
Это подчеркивает возможно проблема при разработке ASP.NET веб-сайтов при использовании VSD вместо локального IIS.
Также, обратитесь к этому сообщению от меня о том, как обрабатывать сообщения об ошибках с помощью IIS7, если вы хотите иметь полный контроль над выводом ошибок.
Краткие сведения:
- Развивающийся в
VSDS
- использоватьcustomErrors
- Публикация сайта для
IIS6
- использоватьcustomErrors
- Публикация сайта для
IIS7
- использоватьhttpErrors
.
и если вы развиваетесь с VSDS
но опубликовать для IIS7
, тогда, я думаю, вам понадобится и то, и другое.
Другие советы
* Обновлено в апреле 2016 года
Атрибут customErrors используется, когда .net-код генерирует исключение (404, 403, 500 и т.д.), А атрибут httpErrors используется, когда сам IIS генерирует исключение.
- /myfakeextensionslessurl --> httpErrors 404
- /myfakeaspsx.aspx --> Ошибки пользователя 404
- /myfakeimage.jpg --> httpErrors 404 Ошибки
- /throw500.apx --> Ошибки пользователя 500
- /throw500 --> Ошибки пользователя 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;
%>
Примечание:Использование URL-адресов без расширения в разделе customErrors является это невозможно!. (без взломов)
Один из способов обхода заключается в отключении пользовательских ошибок и разрешении 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
<customErrors>
против <httpErrors>
<customErrors>
- все еще доступен в IIS7 +
- укажите пользовательские страницы ошибок для запросов, обрабатываемых ASP.NET
- обрабатывает запросы только в приложении ASP.NET
- статические файлы, такие как HTML-файлы или каталог (“дружественный”) URL-адреса не обрабатываются
<httpErrors>
- введено в IIS7
- укажите пользовательские страницы ошибок для запросов, обрабатываемых IIS
- обрабатывает запросы внутри приложения ASP.NET И/ИЛИ обрабатывает запросы вне - ASP.NET приложение *
- обрабатываются все файлы и URL-адреса *
Примечание:больше нет необходимости использовать
customErrors
Цитируемый источник: Пользовательский 404 и страницы ошибок в ASP.NET (отличная статья)
ExecuteURL
обслуживает динамический контент, такой как страница .aspx (the path
значение должно быть относительный URL-АДРЕС сервера):
<system.webServer>
<httpErrors errorMode="Custom" existingResponse="Auto" defaultResponseMode="ExecuteURL" >
<remove statusCode="404"/>
<error statusCode="404" responseMode="ExecuteURL" path="/error.aspx" />
</httpErrors>
</system.webServer>
File
обслуживает пользовательский файл ошибки, такой как HTML-страница:
<system.webServer>
<httpErrors errorMode="Custom" existingResponse="Auto" defaultResponseMode="File" >
<remove statusCode="404"/>
<error statusCode="404" path="404.html" />
</httpErrors>
</system.webServer>
Ссылка: Ошибки HTTP (www.iis.net)
для получения более подробной информации прочитайте www.iis.net ссылку выше
Раздел ошибок в web config предназначен для предоставления пользовательского подхода к обработке ошибок http. Есть два раздела, один customErrors внутри раздела system.web и другой httpErrors внутри раздела system.webServer (как указано ниже)
Ошибки клиентов : Этот раздел использовался до появления IIS 7, IIS 6 5 и до полного использования этого раздела для обработки пользовательских ошибок http в соответствии с кодом состояния http.
httpErrors : IIS 7 и более поздние версии используют этот раздел, а также Ошибки клиентов раздел для обработки пользовательских ошибок http на основе их расширений файлов, если запрошенное расширение страницы регистрируется в ISAPI dll (.aspx, ashx, .asmx, .svc и т.д.), например index.aspx, затем IIS выбирает настройку из Пользовательские ошибки раздел else, из которого он выбирает настройку httpErrors (Режим размещения IIS 7 должен быть установлен как интегрированный, а не классический)
ниже приведены примеры, предназначенные для проверки ссылки на обработку ошибок 404 :