Настройка настраиваемой страницы 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. Вы можете найти это то, на что вы хотите обратить внимание, чтобы улучшить работу вашего приложения, а не как исправление существующей проблемы, что может потребовать некоторого времени для изучения.

Там есть отличные статьи, видеоуроки и информация о том, как использовать этот инструмент.

Другие вопросы по тегам