Настройка настраиваемой страницы ASP 404 с перенаправлением для веб-сайта IIS7
Мы переносим существующий веб-сайт с IIS6 на IIS7, но испытываем некоторые трудности при настройке страницы с ошибкой 404. Наша страница с ошибкой 404 работает так:
- Пользовательская ASP-страница проверяет URL по короткому списку "специальных" URL (например, http://example.com/limited-offers).
- Если URL-адрес известен, он перенаправляется на фактический URL-адрес этой страницы.
- В противном случае посетитель будет перенаправлен на страницу статических ошибок с кодом состояния 404.
С IIS6 это работало как рекламируется, но с IIS7 некоторые вещи изменились. IIS7 всегда будет отображать настроенную страницу ошибок, когда обнаружит код состояния, для которого определена страница ошибок. В случае нашей статической страницы ошибок с кодом 404, это означает, что IIS7 снова выполнит пользовательскую ASP-страницу. Это приводит к бесконечному перенаправлению.
Мы обнаружили, что это поведение можно обойти, добавив параметр в Web.Config
<system.webServer>
<httpErrors existingResponse="PassThrough" />
</system.webServer>
Однако после добавления этого наша настраиваемая ASP-страница отказывается от перенаправления. После проверки с помощью Fiddler кажется, что IIS7 вызывает код состояния 404, перезаписывая наше перенаправление 302.
Кто-нибудь может порекомендовать другой подход для решения нашей проблемы?
3 ответа
Я успешно использую аналогичную настройку, которую я перенес с IIS 6 на IIS 7. Мой web.config имеет следующий раздел;
<system.webServer> <httpErrors errorMode="Custom"> <remove statusCode="500" subStatusCode="-1" /> <remove statusCode="404" subStatusCode="-1" /> <error statusCode="404" prefixLanguageFilePath="" path="/302page.asp" responseMode="ExecuteURL" /> <error statusCode="500" prefixLanguageFilePath="" path="/500page.asp" responseMode="ExecuteURL" /> <error statusCode="500" subStatusCode="100" path="/500page.asp" responseMode="ExecuteURL" /> </httpErrors> <system.webServer>
Я настроил это на соответствующем сайте через IIS Manager, но вы можете сделать это через файл web.config, если вам будет проще.
Вы можете добавить условный заголовок в зависимости от того, должно ли быть 301, 302 или 404.
404;
Response.Status = "404 Not Found"
Response.AddHeader "Location", pagename
302 (временное перенаправление);
Response.Status="301 Object Moved"
Response.AddHeader "Location", pagename
301 (постоянное перенаправление);
Response.Status="301 Moved Permanently"
Response.AddHeader "Location", pagename
Пул приложений сайта IIS использует встроенный конвейерный режим. И прилагаются настройки для отладки раздела для сайта.
Я столкнулся с подобным сценарием для клиента на другой неделе. Решение было настроить ваш <httpErrors>
следующее:
<httpErrors errorMode="Custom" existingResponse="Auto">
<remove statusCode="404" subStatusCode="-1" />
<error statusCode="404"
prefixLanguageFilePath=""
path="/404.asp"
responseMode="ExecuteURL" />
<remove statusCode="500" subStatusCode="100" />
<error statusCode="500"
subStatusCode="100"
prefixLanguageFilePath=""
path="/500-100.asp"
responseMode="ExecuteURL" />
</httpErrors>
Это работает с Cactushop (написанным на Classic ASP), который имеет "дружественные" URL-адреса и где они используют страницу обработчика 404 для анализа URL-адреса и отображения продуктов или списка категорий продуктов и так далее.
В качестве альтернативы вы можете использовать модуль расширения IIS: URLRewrite. Это позволит вам настроить пользовательские SEO дружественные URL. Вы можете найти это то, на что вы хотите обратить внимание, чтобы улучшить работу вашего приложения, а не как исправление существующей проблемы, что может потребовать некоторого времени для изучения.
Там есть отличные статьи, видеоуроки и информация о том, как использовать этот инструмент.