#asp.net #asp.net-mvc #redirect #iis #custom-error-pages
#asp.net #asp.net-mvc #перенаправление #iis #пользовательские страницы ошибок
Вопрос:
Я пытаюсь показать пользовательские страницы ошибок в моем ASP.NET Приложение MVC. Я понимаю, что некоторые ошибки обрабатываются ASP.NET и другие от IIS.
The ASP.NET они обрабатываются и работают нормально
<customErrors mode="On" defaultRedirect="~/Error/Index"/>
Когда я запрашиваю URL, который не существует, и ссылается на статическую страницу, такую как .html, я ожидаю, что IIS обработает его.
<httpErrors errorMode="Custom">
<remove statusCode="404"/>
<error statusCode="404" path="http://localhost/MySite/404.html" responseMode="Redirect"/>
</httpErrors>
И это работает. Однако я не хочу жестко кодировать http://localhost там, но сделайте это относительным путем.
Итак, я попытался
<httpErrors errorMode="Custom">
<remove statusCode="404"/>
<error statusCode="404" path="~/404.html" responseMode="Redirect"/>
</httpErrors>
Однако это продолжает перенаправлять меня (кажется), поскольку URL-адрес заканчивается http://localhost/MySite/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/404.html
Это также работает, если я делаю
<httpErrors errorMode="Custom">
<remove statusCode="404"/>
<error statusCode="404" path="404.html" responseMode="Redirect"/>
</httpErrors>
Но, конечно, только если ошибка находится в http://localhost/MySite/doesnotexist.html
корневом каталоге, но не в каком-либо другом подобном http://localhost/MySite/somedir/doesnotexist.html
Если я изменю responseMode
на любой из других параметров, он вообще не работает, показывает мне страницу IIS 404 по умолчанию.
Я глубоко озадачен, что вызывает цикл перенаправления?
Комментарии:
1. Является ли path=»~/404.html » просто не указан правильный путь? Т.Е. корень веб-приложения?
Ответ №1:
Я смог воспроизвести поведение, которое вы описываете. Мой был исправлен, когда я изменил responseMode на file . Т. Е. вот так
<httpErrors errorMode="Custom">
<remove statusCode="404" />
<error statusCode="404" path="404.html" responseMode="File" />
</httpErrors>
Но, возможно, проблема в том, что вы поместили свой 404.html в папке mysite. Предполагая, что он должен оставаться там, я думаю, что это должно сработать, если вы сделаете это
<httpErrors errorMode="Custom">
<remove statusCode="404" />
<error statusCode="404" path="/mysite/404.html" responseMode="Redirect" />
</httpErrors>
Комментарии:
1. Mysite — это приложение IIS, которое можно настроить, поэтому я также не могу жестко закодировать это. Но вы правы, что это будет работать так же, как при использовании localhost/MySite/404.html . Когда я использую
file
, он вообще не распознает его, это все равно, что вообще не указывать никаких httpErrors
Ответ №2:
Атрибут path указывает путь к файлу или URL, который отправляется в ответ на ошибку HTTP, указанную атрибутами StatusCode и subStatusCode. Если вы выбираете режим ответа файла, вы указываете путь к пользовательской странице ошибок. Если вы выбираете режим ответа ExecuteURL, путь должен быть относительным URL сервера (например, /404.htm ). Если вы выберете режим ответа перенаправления, вам необходимо ввести абсолютный URL (например, www.contoso.com/404.htm).
Атрибут responseMode указывает, как возвращается содержимое пользовательской ошибки. Атрибут responseMode может иметь одно из следующих возможных значений. Перенаправляет клиентские браузеры на URL, указанный в атрибуте path, который содержит пользовательский файл ошибки. Если для responseMode установлено значение Redirect, значением path должен быть абсолютный URL.
Комментарии:
1. Спасибо, да, я прочитал об этом, и вот как это происходит. Однако мне интересно, есть ли способ ввести путь относительно корня приложения, а не корня сервера, без указания имени приложения / папки
2. Это кажется невозможным, вам нужно выбрать, какой путь использовать в соответствии с responseMode, существует только три responseMode, и нет пути относительно корня приложения.