IIS Express выдает 403.14 Forbidden
ошибки, когда URL-адрес, который в противном случае обрабатывался бы посредством маршрутизации URL-адресов ASP.NET, соответствует физической папке в моем проекте ASP.NET. (Папка содержит только код, и это совпадение, что имя папки совпадает с URL-адресом страницы; моя структура URL-адреса определяется динамически базой данных, и пользователи могут редактировать эту структуру, поэтому, хотя я мог просто переименовать свою папку проекта, в общем, я не могу предотвратить такое столкновение.)
Похоже, это происходит из-за того, что DirectoryListingModule
вмешивается, чтобы обработать запрос, а затем сразу же не выполняет его, потому что просмотр каталогов отключен. Я пробовал удалить это:
<system.webServer>
<handlers>
<remove name="StaticFile" />
<add name="StaticFile" path="*" verb="*"
modules="StaticFileModule" resourceType="Either" requireAccess="Read" />
</handlers>
</system.webServer>
Это удаляет конфигурацию обработчика StaticFile
по умолчанию, которая имеет modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule"
, и заменяет ее конфигурацией, которая предоставляет только ту функцию, которую я хочу. (Я хочу обслуживание статических файлов, но мне не нужен список каталогов или документы по умолчанию в этом приложении.) Но эффект, похоже, таков, что IIS затем выдает полностью пустой (0 байт) ответ (со статусом 200), когда я нажимаю оскорбительная страница.
Итак, затем я попытался настроить обработчик StaticFile
для обработки только определенных физических папок, которые я хочу сделать доступными:
<system.webServer>
<handlers>
<remove name="StaticFile" />
<add name="StaticFileCss" path="style/*.css" verb="*"
modules="StaticFileModule" resourceType="Either" requireAccess="Read" />
<add name="StaticFileScripts" path="Scripts/*" verb="*"
modules="StaticFileModule" resourceType="Either" requireAccess="Read" />
</handlers>
</system.webServer>
Но когда я нажимаю неправильный URL-адрес, возникает 404.4 - Not found
ошибка с сообщением The resource you are looking for does not have a handler associated with it.
. (Подробная информация об ошибке на странице ошибки говорит, что мы находимся в модуле IIS Web Core
, во время уведомления MapRequestHandler
обработчиком является Not yet determined
, и есть код ошибки 0x80070002
, который представляет собой COM HRESULT, соответствующий ошибке Win32 ERROR_FILE_NOT_FOUND
. )
Загадочно то, что ASP.NET даже не удосуживается спросить, есть ли у него обработчик для этого. Кажется, что IIS сам по себе решает, что обработчика точно нет.
Это происходит только тогда, когда есть папка, соответствующая URL-адресу. Все другие ресурсы с динамически определяемыми URL-адресами работают нормально - IIS запрашивает у ASP.NET обработчик, механизм маршрутизации ASP.NET работает как обычно, и если URL-адрес соответствует одной из моих динамически определяемых страниц, все работает нормально. Просто наличие физической папки мешает всему этому работать.
Я вижу, что это делает IIS, потому что я получаю одну из страниц ошибок в стиле IIS для этого 404, и они имеют отличительный дизайн, который сильно отличается от 404, созданных ASP.NET. (Если я попытаюсь перейти к URL-адресу, который не соответствует ни физической папке, ни динамическому ресурсу, я получаю страницу 404, созданную ASP.NET. Обычно IIS определенно передает запросы в ASP.NET, но IIS определенно мешает этим проблемным ресурсам.)
Я попытался добавить это в свой <system.WebServer>
, на случай, если проблема заключалась в том, что IIS решил, что запросы, соответствующие физическим папкам, не соответствуют предварительному условию managedHandler
:
<modules runAllManagedModulesForAllRequests="true">
Но это, похоже, не помогает - он по-прежнему не включает маршрутизацию ASP.NET для URL-адресов, которые соответствуют физическим папкам. В любом случае это было бы неоптимально - я бы предпочел, чтобы управляемые обработчики не запускались для контента, который я определенно хочу обрабатывать как статический контент. Я действительно хочу, чтобы маршрутизация URL-адресов ASP.NET использовалась в качестве средства защиты - я хочу, чтобы она применялась только в том случае, если URL-адрес определенно не относится к статическому содержимому.
Я не понимаю, почему ASP.NET даже не спрашивает ASP.NET, что он думает в этом сценарии. Почему он не вызывает ASP.NET на этапе MapRequestHandler
, если есть физическая папка, которая соответствует URL-адресу?