Коды ошибок IIS 7 - PullRequest
       46

Коды ошибок IIS 7

0 голосов
/ 05 марта 2011

Я использую сайт Sitefinity CMS на IIS 7. Я вижу несколько странных результатов, когда пытаюсь вернуть статус 404.

Если я перехожу по URL-адресу, например:

www.mysitefinitywebsite.com / test.co.uk (я понимаю, что это неверный адрес, но кто-то ввел его в CMS)

Поскольку приведенное выше не является страницей ASPX, я считаю,IIS обрабатывает ошибку, используя следующий код:

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

URL-адрес в адресной строке остается прежним, отображается моя пользовательская страница 404 (/404.aspx), однако http-код состояния 200возвращается.

Если, однако, введен следующий URL:

www.mysitefinitywebsite.com / test.aspx - обработчик ошибок ASPX запускается со следующей конфигурацией:

<customErrors mode="On" >
    <error redirect="~/Sitefinity/nopermissions.aspx" statusCode="403" />
    <error redirect="~/404.aspx" statusCode="404" />
</customErrors>

Снова отображается моя пользовательская страница 404, однако URL-адрес в адресной строке меняется на:

www.mysitefinitywebsite.com / 404.aspx? Aspxerrorpath = / test.aspx

И как ни странно, если я проверяю Firebug, код 302 возвращается для text.aspx, а затем статусиз 200 для /404.aspx?aspxerrorpath=/test.aspx.

Я не до конца понимаю, что здесь происходит, похоже, что IIS вообще не отвечает кодом состояния - это разработано?Кажется совершенно сумасшедшим!

Если это так, предположительно, единственный способ решить эту проблему - программно вернуть правильный код ответа?

Заранее спасибо, хиггси

1 Ответ

0 голосов
/ 05 марта 2011

Когда вы используете элемент <httpErrors> и используете executeUrl, вы обслуживаете динамический контент. Если это содержимое явно не возвращает код состояния (страницу asp.net, asp и т. Д.), Вам нужно установить для атрибута existingResponse значение auto / replace / passthrough, как вы считаете нужным.

Здесь подразумевается, что веб-сервер может иметь общую ошибку, и вы можете захотеть вернуть другой или расширенный код ошибки своим клиентам. Это имеет больше смысла для API, где вы можете захотеть, чтобы 404 содержал / возвращал больше информации о том, что не было найдено, и т. Д., И т. Д.

Взгляните на документацию IIS.NET по httpErrors для существующего флага Response

http://www.iis.net/ConfigReference/system.webServer/httpErrors


Что касается ASP.NET, перенаправление 302 при ошибке является поведением по умолчанию, которое вы видите. 404 возвращается на той странице, на которую вы перенаправляете, программно устанавливает код состояния ответа.

Разница заключается просто в обработке. В первом случае вы разрешаете IIS обрабатывать ошибку перед выполнением конвейера ASP.NET. Во втором случае IIS переходит в конвейер ASP.NET. Это две разные технологии, отсюда и два разных поведения. Будьте уверены, с небольшим исследованием вы можете заставить их сделать то же самое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...