Перезапись URL, вызывающая цикл перенаправления

Сегодня меня беспокоит проблема с настройкой перезаписи URL на старом веб-сайте.Net Webforms (РЕДАКТИРОВАТЬ: это проект веб-сайта, а не проект веб-приложения, если это имеет значение). Сайт, на котором я работаю, связан с большим количеством ссылок, все ссылки на "webroot.com/default.aspx", а не просто на "webroot.com". Мы хотим настроить (КУДА-ТО, на данный момент мне все равно, если он находится в global.asax как перенаправление или web.config) переписать URL, чтобы перейти из /default.aspx в /.

Я попытался настроить в коде через global.asax:

if (Request.Url.PathAndQuery.ToLower().Contains("/default.aspx"))
  Response.RedirectPermanent("/" + Request.Url.Query, true);

Это приводит к циклу перенаправления, который, как я понимаю, полностью понимаю, почему, было глупой идеей попробовать это. Ни в одном другом каталоге нет default.aspx, поэтому я не беспокоюсь о том, чтобы ловить других в данный момент.

Я попытался настроить перезапись URL через web.config в узле system.webServer, как показано здесь:

<rewrite>
  <rules>
    <rule name="RemoveDefaultAspxFromRoot" stopProcessing="true">
      <match url="default.aspx" ignoreCase="true" />
      <action type="Rewrite" url="/" appendQueryString="true" />
    </rule>
  </rules>
</rewrite>

Это приводит к той же самой проблеме, которая озадачивает меня, поскольку я не думал, что переписывание выполнит перенаправление, но, очевидно, так и есть?

Я попытался добавить следующее в правило в качестве идеи поста в блоге вуду:

<conditions logicalGrouping="MatchAll">
  <add input="{REMOTE_PORT}" pattern=".*" />
</conditions>

Без кубиков; все еще застрял в петле перенаправления.

Я даже прошел установку модуля перезаписи URL вручную в IIS и установил там правило через графический интерфейс, который можно увидеть здесь:

http://i.imgur.com/ovYpfhM.png

Я все еще получаю проблему перенаправления.

Кто-нибудь может увидеть что-то, что мне не хватает, или есть другие предложения? Странно, что эта проблема, кажется, решена для других людей с помощью действия Rewrite, но это не работает для меня.

Я пробовал эти решения на IIS7, публикуя их локально и настраивая через IIS и IIS Express через VS2013. Наши производственные серверы используют IIS7.

2 ответа

Решение

Я решил добавить следующее в мой web.config для решения этой проблемы:

<defaultDocument>
  <files>
   <clear />
   <add value="default.aspx" />
  </files>
 </defaultDocument>

на основе реддит поста. Итак, мой общий файл web.config для этого раздела выглядит так:

<system.webServer>
    <rewrite>
      <rules>
        <rule name="RemoveDefaultAspxFromRoot" stopProcessing="true">
          <match url="default.aspx" ignoreCase="true" />
          <action type="Redirect" url="/" appendQueryString="true" />
        </rule>
      </rules>
    </rewrite>
    <defaultDocument enabled="true">
      <files>
        <clear />
        <add value="default.aspx" />
      </files>
    </defaultDocument>
  </system.webServer>

Это прекрасно работает без добавления других файлов. Я не обязательно уверен, что понимаю, почему очистка документов по умолчанию и добавление "default.aspx" работает, когда "default.aspx" уже был установлен в качестве документа по умолчанию через IIS, но это решило мою проблему. Если кто-нибудь может помочь объяснить, почему это так, я хотел бы узнать.

В IIS есть функция документа "по умолчанию", может быть, страница default.aspx является частью этого списка, и хотя вы перенаправляете на "/", что, в свою очередь, переводится в "default.aspx". Который затем переводится в "/" через правило перенаправления, вызывающее цикл.

Смотрите ваш файл ApplicationHost.config для глобальных правил. Также посмотрите этот URL, который документирует иерархию правил.

"Оценка выполняется в порядке" родитель-ребенок ", что означает, что родительские правила оцениваются первыми, а правила, определенные на последнем дочернем уровне, оцениваются последними". - http://www.iis.net/learn/extensions/url-rewrite-module/url-rewrite-module-configuration-reference

Попробуйте альтернативное правило перенаправления:

Создайте отдельную страницу с другим именем "notdefault.aspx" в корневом каталоге и перенаправьте все значения по умолчанию на вновь создаваемую страницу. (Скопируйте default.aspx в nodefault.aspx)

Также см. Эту ссылку для получения дополнительной информации о контроле по умолчанию: https://technet.microsoft.com/en-us/library/cc753615(v=ws.10).aspx

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