Почему настройка customErrors в web.config не работает в этом случае?

На моем веб-сайте ASP.NET 3.5, который опубликован в общедоступном хостинг-провайдере, я настроил свой файл web.config следующим образом:

    <customErrors mode="On" defaultRedirect="GenericErrorPage.htm">
        <error statusCode="403" redirect="AccessDenied.htm"/>
        <error statusCode="404" redirect="FileNotFound.htm"/>
    </customErrors>

Если страницы запроса пользователя не существуют (например, "www.example.com/NotExistPage.aspx" ), пользователь будет перенаправлен на страницу FileNotFound.htm, как мы ожидаем.

Но если пользователь запросит какой-либо адрес, например: "www.example.com/NotExistDirectory" без расширения .aspx, пользователь столкнется с страницей ошибок IIS 7.5:

Ошибка HTTP 404.0 - не найдена ресурс, который вы ищете, был удалено, изменилось ли его имя или временно недоступен.

Отмеченная информация об ошибке:

Module  IIS Web Core
Notification    MapRequestHandler
Handler StaticFile
Error Code  0x80070002

Requested URL   http://www.example.com:80/NotExistDirectory
Physical Path   D:\Websites\example\example.com\wwwroot\NotExistDirectory
Logon Method    Anonymous
Logon User  Anonymous

Это желтая страница, которая не является удобной для пользователя, и мы этого не ожидали.

Мне интересно установить customeError в webconfig не поддерживает этот тип адреса или нет? Как я могу запретить пользователям видеть эту желтую страницу.

Изменить: Спасибо Дэвиду, но я нашел фактическую причину и правильное решение. Пожалуйста, см. Мой ответ.

Ответ 1

@Mostafa: Я столкнулся с той же проблемой. Я узнал, что это можно решить, добавив следующее в файл web.config:

<system.webServer>
    <httpErrors errorMode="Custom">
      <remove statusCode="404" subStatusCode="-1" />
      <error statusCode="404" subStatusCode="-1" prefixLanguageFilePath="" path="/MyErrorPage.aspx" responseMode="ExecuteURL" />
    </httpErrors>
  </system.webServer>

Ответ 2

Это связано с тем, что модуль ASP.Net настроен для обработки определенных расширений файлов. IIS определяет, что .aspx должен обрабатываться модулем ASP.Net, а затем выполняется секция customerrors в файле web.config(и, действительно, сам web.config).

Поскольку вы запросили страницу, даже не настроенную для ASP.Net, IIS обрабатывает ее самостоятельно, не передавая запрос.

Ответ 5

Во-первых, URL-адрес каталога должен иметь конечную косую черту, в противном случае это просто файл без расширения. www.mysite.com/NotExistDirectory/
Во-вторых, ASP.NET IIS-модуль является обработчиком только для типов ASP MIME, поэтому каталог остается для веб-сервера. В-третьих, customerror является частью system.web является частью конфигурации ASP.net
и httperror является частью system.webserver является частью конфигурации IIS.
Предполагая, что настройки модуля http по умолчанию в конфигурации IIS httperror будет работать с пользовательской ошибкой для несуществующего каталога.

Ответ 6

Это интересно, через пару лет я внезапно понял, в чем проблема.

Благодаря решению @David, но причина и полное решение - вот что:

Установив режим customErrors на "On", он работает только тогда, когда мы получаем исключение в приложении ASP.NET. Когда мы пытаемся достичь nonExistingdirectory or notExsitingStaticResouce, IIS выдает ошибку 404, и это делает не достигают времени выполнения asp.net и serverd с помощью IIS.

Итак, нам нужно добавить конфигурацию для IIS, как показано ниже в Web.config:

  <system.webServer>
    <httpErrors errorMode="Custom">
      <remove statusCode="404"/>
      <error statusCode="404" path="~/404.html" responseMode="File" />
    </httpErrors>
  <system.webServer>

Важно установить responseMode в "File", иначе код состояния автоматически изменится с 404 на 200. Таким образом, с точки зрения клиента они не получают фактический код статуса 404.