Персонализированное перенаправление страницы 404 не работает в IIS7.5, если отсутствующий URL-адрес находится в подпапке - PullRequest
2 голосов
/ 30 ноября 2011

У меня есть сайт со смесью страниц .html и .aspx, работающий на сервере W2K8 R2 с IIS 7.5. Сайт представляет собой реконструкцию старого сайта, и все URL-адреса и большая часть контента изменились со старого сайта на новый. Я ожидаю получить число 404, поскольку люди используют старые ссылки.

Я хочу перенаправить 404 ошибки на пользовательскую страницу (/404.aspx). Это (часть) моего web.config:

  <system.web>
    <customErrors mode="On" redirectMode="ResponseRewrite"> 
      <error statusCode="404" redirect="/404.aspx" />
    </customErrors>
  </system.web>
  <system.webServer>
    <httpErrors errorMode="Custom" existingResponse="Replace">
      <remove statusCode="404" subStatusCode="-1" />
      <error statusCode="404" prefixLanguageFilePath="" path="/404.aspx"  
             responseMode="ExecuteURL" />
    </httpErrors>
  </system.webServer>

Режим управляемого конвейера для пула приложений для этого сайта: Integrated.

Это перенаправление на мою пользовательскую страницу 404.aspx иногда работает хорошо, а в других случаях - только вид работы. Такие URL-адреса перенаправляют просто отлично:

Однако такие URL-адреса (где отсутствующая страница находится в подпапке) дают странный результат:

Что происходит с URL-адресами подпапок, так это то, что я получаю разметку HTML со страницы 404.aspx, но страница не отображается должным образом, поскольку все ссылки на CSS и скрипты на странице отсутствуют, насколько я могу от перехвата сетевого трафика, потому что почему-то IIS пытается вставить /folder/ в URL для ресурсов с относительными путями на моей странице 404.aspx. Например, моя страница 404.aspx, которая находится в корневой папке моего сайта, имеет ссылку на css/style.css, но для страницы 404, вызванной отсутствующей страницей в / folder /, браузер пытается загрузить: /folder/css/style.css - что очевидно не там.

Кто-нибудь знает, что я здесь не так делаю?

1 Ответ

1 голос
/ 01 декабря 2011

Вы можете использовать абсолютный путь (начните с прямой косой черты от корня вашего сайта) для ссылки на таблицы стилей:

<link rel="stylesheet" href="/css/style.css" type="text/css" />

Или вы можете использовать относящиеся к корню URL (начинайте с тильды и прямой косой черты).Если <link> -элемент находится в <head runat="server"> -элементе, то относительный корень URL будет преобразован в правильный относительный путь на стороне клиента.

<head runat="server">
  <link rel="stylesheet" href="~/css/style.css" type="text/css" />

Для сценариев необходимо разрешить root-относительные URL сами.Используйте метод ResolveUrl () System.Web.UI.Page:

<script type="text/javascript" src="<%= ResolveUrl("~/scripts/script.js") %>"></script>

Или вам просто нужно установить responseMode в redirect в вашей конфигурации.

...