Кастомная ошибка IIS 404
Я развернул приложение ASP.NET 3.5 на 64-битном сервере Windows 2003 R2.
В web.config у меня есть следующее
<customErrors mode="RemoteOnly"
defaultRedirect="/404/">
<error statusCode="404"
redirect="/404/"/>
<error statusCode="500"
redirect="/500/"/>
</customErrors>
В свойствах веб-сайта в IIS Manager я установил для ошибок 404 и 500 значение Type = "URL" и те же URL-адреса, что и в файле web.config.
У меня есть подстановочная карта приложения к.NET 2.0 aspnet_isapi.dll с отключенным "Проверить, что файл существует".
Если я пытаюсь найти поддельный файл.aspx, меня успешно отправляют на страницу 404. Я верю, что это потому, что существует явное сопоставление.aspx с.NET DLL.
Если я пытаюсь получить доступ к поддельному каталогу, я просто получаю текстовый ответ:
Система не может найти указанный файл.
Может показаться, что эти запросы на каталоги не направляются через конвейер.NET, что, как я ожидал (и должен был бы) произойти из-за сопоставления с подстановочными символами приложения.
Есть идеи?
3 ответа
Чтобы проверить вашу логику, я на самом деле прошел весь процесс. Я использовал трассировку ETW для IIS, ASP.NET и Process Monitor, чтобы увидеть, что происходит. Вот что я нахожу:
- Когда вы добавляете "Сопоставление по шаблону" для aspnet_isapi.dll с непроверенным "Убедитесь, что файл существует", весь запрос фактически проходит через конвейер.net
- Когда вы получаете доступ к поддельному каталогу,.net фактически ищет все файлы.config.. т.е. machine.config, корневой web.config (он находится в C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG) и ваш веб корневой каталог сайта, чтобы найти возможный HttpHandler, который может обработать ваш запрос
- Поскольку ни один из обработчиков не настроен на обработку запроса "каталог", запрос возвращается к
IISGeneral: GENERAL_STATIC_FILE_HANDLER
и терпит неудачу с0x80070002
то есть FILENOTFOUND - Так как пользовательская ошибка IIS 404 настроена как /404/, она просматривает каталог c:\inetpub\wwwroot\404\, завершается с другим
0x80070002
и отправляет общийThe system cannot find the file specified.
ошибка. - Когда вы получаете доступ к поддельной странице main.aspx, запрос.aspx обрабатывается в корневом файле web.config, и, следовательно, вы видите специфическую ошибку.net (ресурс не найден.).
- Теперь, когда вы проверяете "Убедитесь, что файл существует" для "Сопоставления с подстановочными знаками", сервер проверяет, существует ли запрошенный скрипт, прежде чем сопоставлять расширение приложению.
- Следовательно, запрос никогда не проходит через конвейер.net и выдает ошибку, как указано в пункте 4.
Надеюсь это поможет.
Для IIS 5.0 счастливый путь - это:
Свойства> Home Directroy > Расширенная конфигурация: выберите интересующее вас расширение и установите флажок "Проверить наличие файла".
Если у вас есть отображение с подстановочными знаками без включенного "проверить файл существует", он отправит запрос в вашу DLL. Если DLL-библиотека ASP.Net 2.0, к которой она подключена, НЕ использует web.config для вашего приложения (вы упомянули, что это было для.Net 3.5), то она выдаст общую ошибку. Если вы включите опцию "проверить файл существует", IIS увидит, что папки там нет, и вместо этого будет использовать свои внутренние настройки ошибок (которые, как вы сказали, такие же, как в файле web.config). Возможно, попробуйте включить эту опцию, чтобы увидеть, помогает ли это в вашей ситуации.