Столкнулся с ситуацией, которая, похоже, не описана в документации: такое впечатление, что модуль URL Rewrite не всегда срабатывает...
Итак, первое обстоятельство: в web.config есть секция:
<httpErrors errorMode="Custom" existingResponse="Replace" defaultPath="/Errors/ServerError">
<clear/>
<error responseMode="ExecuteURL" statusCode="403" path="/Errors/NotSupported"/>
<error responseMode="ExecuteURL" statusCode="404" path="/Errors/PageNotFound"/>
<error responseMode="ExecuteURL" statusCode="410" path="/Errors/Gone"/>
<error responseMode="ExecuteURL" statusCode="500" path="/Errors/ServerError"/>
<error responseMode="ExecuteURL" statusCode="503" path="/Errors/ServiceUnavailable"/>
</httpErrors>
В MVC-приложении есть ErrorsController с соответвующими actions (ServerError, NotSupported и т.д.) Таким образом, в случае ошибок мы показывает красивые странички с неким динамическим контентом. Вот как оно работает: когда пользователь запрашивает несуществующий адрес http://example.ua:80/some-invalid-URL/ , IIS незаметно подменяет этот адрес на http://example.ua/Errors/PageNotFound?404;http://example.ua:80/some-invalid-URL/ и возвращает клиенту полученный HTML. Код ошибки и проблемный адрес передаются в query string, поэтому MVC приложение может их как-нибудь использовать.
Второе обстоятельство: я использую модуль URL Rewrite. В нем есть довольно сложная логика, которая добавляет к запросу нестандартный заголовок HTTP, который я потом использую в приложении. Этот заголовок для меня очень важен - он проверяется при каждом запросе. Казалось, непробиваемая система - ведь запрос даже не дойдет до приложения, пока не пройдет URL Rewrite. По идее, может сломаться, только если отключить URL Rewrite или неправильно его сконфигурировать?
Но оказывается, что в очень редких случаях это не работает: когда URL ошибочная, и при этом в ней есть точка, или она заканчивается на пробел. Насколько я понимаю, в этой ситуации IIS пересылает запрос в приложение (в ErrorsController) напрямую, минуя URL Rewrite. Возможно, по соображениям безопасности. А может, баг (версия IIS - 8.0.9200.16384).
Итак, первое обстоятельство: в web.config есть секция:
<httpErrors errorMode="Custom" existingResponse="Replace" defaultPath="/Errors/ServerError">
<clear/>
<error responseMode="ExecuteURL" statusCode="403" path="/Errors/NotSupported"/>
<error responseMode="ExecuteURL" statusCode="404" path="/Errors/PageNotFound"/>
<error responseMode="ExecuteURL" statusCode="410" path="/Errors/Gone"/>
<error responseMode="ExecuteURL" statusCode="500" path="/Errors/ServerError"/>
<error responseMode="ExecuteURL" statusCode="503" path="/Errors/ServiceUnavailable"/>
</httpErrors>
В MVC-приложении есть ErrorsController с соответвующими actions (ServerError, NotSupported и т.д.) Таким образом, в случае ошибок мы показывает красивые странички с неким динамическим контентом. Вот как оно работает: когда пользователь запрашивает несуществующий адрес http://example.ua:80/some-invalid-URL/ , IIS незаметно подменяет этот адрес на http://example.ua/Errors/PageNotFound?404;http://example.ua:80/some-invalid-URL/ и возвращает клиенту полученный HTML. Код ошибки и проблемный адрес передаются в query string, поэтому MVC приложение может их как-нибудь использовать.
Второе обстоятельство: я использую модуль URL Rewrite. В нем есть довольно сложная логика, которая добавляет к запросу нестандартный заголовок HTTP, который я потом использую в приложении. Этот заголовок для меня очень важен - он проверяется при каждом запросе. Казалось, непробиваемая система - ведь запрос даже не дойдет до приложения, пока не пройдет URL Rewrite. По идее, может сломаться, только если отключить URL Rewrite или неправильно его сконфигурировать?
Но оказывается, что в очень редких случаях это не работает: когда URL ошибочная, и при этом в ней есть точка, или она заканчивается на пробел. Насколько я понимаю, в этой ситуации IIS пересылает запрос в приложение (в ErrorsController) напрямую, минуя URL Rewrite. Возможно, по соображениям безопасности. А может, баг (версия IIS - 8.0.9200.16384).
Комментариев нет:
Отправить комментарий