IIS7 404 ошибки - PullRequest
       3

IIS7 404 ошибки

3 голосов
/ 25 февраля 2011

У меня есть сайт ASP.NET 3.5, работающий в IIS 7
Я пытаюсь заставить 404 бросить код состояния 404 в первый раз.

В настоящее время, если вы введете

http://www.madeupsiteforexample.com/somethingmadeup

Вы получаете 302, затем 200.
Я пытаюсь заставить это бросить код 404 в первый раз и отобразить страницу 404, которую я установил (/FileNotFound.aspx)

Проблема, с которой я столкнулся, заключается в том, что либо страница 404 отображается с кодом 200, либо IIS вступает во владение, когда видит код состояния 404 и отображает свою собственную ужасную страницу 404, а не мою, созданную пользователем.

Я попытался использовать модули global.asax и установить код состояния в коде моей страницы 404. Все результаты в IIS вступают во владение.

Вот моя реализация Global.asax

protected void Application_Error(object sender, EventArgs e)
{
    Response.TrySkipIisCustomErrors = true;
    Response.StatusCode = 404;
}

Теперь я решил эту проблему с помощью сервера. Передав свой запрос.
Это, однако, приводит к тому, что весь сеанс становится нулевым, и любой код, ссылающийся на Session, вызывает исключение. Также код, пытающийся извлечь элементы из файлов ресурсов, вызывает исключения.

Любые предложения или статьи о "правильном способе" сделать 404 в IIS7?

Ответы [ 4 ]

3 голосов
/ 14 марта 2011

Я также застрял на этом для iis 7 .. Вы можете попробовать это, так как он работал для меня ...

<httpErrors existingResponse="PassThrough" />

У этого человека также была та же проблема, что и у вас. IIS7 переопределяет customErrors при установке Response.StatusCode?

вот искупление происходящего http://www.fidelitydesign.net/?p=21

0 голосов
/ 23 марта 2012

Используйте Server.TransferRequest (не поддерживается в IIS6) вместо Server.Transfer, если вы хотите, чтобы сессия все еще была доступна.

Но мой предпочтительный подход заключается в том, чтобы вызвать Response.StatusCode = 404; в вашем FileNotFound.aspx и установить для web.config значение:

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

Для других, если вы похожи на меня и просто отображаете домашнюю страницу с сообщением вверху для 404 ошибок, вы можете проверить, является ли это запросом 404, поскольку внутри нового запроса есть код состояния, добавленный к URL, т.е.

if (Request.Url.ToString().Contains("?404;"))
{
    Response.StatusCode = 404;
    Util.DisplayMessage("The page you are looking for no longer exists. If you navigated to this page by clicking a link within this site please <a href='" + ResolveUrl("~/contact.aspx") + "'>contact us</a> to let us know.");
}

Кроме того, пути к изображениям, сценариям и т. Д. Могут быть неправильными, если они относятся к FileNotFound.aspx (т. Е. Не к корню сайта '/ path' или не разрешены на сервере '~ / path') и к отсутствующей странице (т. Е. К текущему URL). ) находится в другой папке. Чтобы исправить это, я говорю браузеру указать базовые относительные пути к местоположению FileNotFound.aspx с базовым тегом и сообщаю серверу, чтобы он совпадал с Context.RewritePath, т.е.

Page.Header.Controls.AddAt(0, new LiteralControl("<base href='" + Request.Url.Scheme + "://" + Request.Url.Authority + VirtualPathUtility.ToAbsolute("~/") + "'/>"));
Context.RewritePath("~/");
0 голосов
/ 25 февраля 2011

Вы можете изменить, какая страница отображается на 404, изменив настройку «Страницы ошибок» в «Веб-сайте по умолчанию» (или специфичную для вашего приложения)

0 голосов
/ 25 февраля 2011

Взгляните на этот учебник , это нормально для настройки пользовательских страниц ошибок через конфигурацию, а не в коде.

...