среда, 1 июля 2015 г.

Секция httpErrors в сочетании с IIS URL Rewrite

Столкнулся с ситуацией, которая, похоже, не описана в документации: такое впечатление, что модуль 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).

Комментариев нет:

Ratings by outbrain