IIS7: Несоответствие длины содержимого из-за перезаписи URL и использования OutboundRules

У меня возникли некоторые проблемы с настройкой исходящих правил для работы на IIS7, вот сценарий, который меня огорчает. Моя конечная цель - заставить любые исходящие правила работать в нескольких браузерах. В этом примере я использую правило, которое удаляет.aspx из различных тегов HTML.

Сценарий 1 (Несоответствие длины содержимого):

Чтобы это конкретное правило работало в IIS7, мне пришлось отключить динамическое сжатие и отключить кэширование по умолчанию. Мне удалось переписать HTML, но возникла еще одна проблема, которая делает его непригодным для использования.

При попытке переписать контент с помощью исходящих правил у меня возникает проблема, когда Chrome и Firefox выполняют постоянную загрузку из-за "несоответствия длины контента" в заголовках (спасибо Fiddler за помощь в его идентификации). Перезапись работает, но это приводит к тому, что длина содержимого будет неправильной, поэтому эти два браузера выглядят так, как будто они загружаются вечно. В частности, в Chrome это вызывает проблему, потому что javascript кажется зависшим, и поэтому все, что jquery не работает, пока кто-то физически не нажмет кнопку остановки.

Это соответствующие разделы файла web.config, с которого я начал, чтобы дать мне такой сценарий:

<system.webServer>
  <rewrite>
    <urlCompression doStaticCompression="false" doDynamicCompression="false" dynamicCompressionBeforeCache="false" />
    <modules runAllManagedModulesForAllRequests="true" />
    <outboundRules>
      <rule name="Remove .aspx from links in the response" preCondition="IsHTML" stopProcessing="false">
        <match filterByTags="A, Area, Base, Form, Frame, IFrame, Link, Img, Script" pattern="(.*)\.aspx(\?.*)?$" />
        <action type="Rewrite" value="{R:1}{R:2}" />
      </rule>
      <preConditions>
        <preCondition name="IsHTML">
          <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" />
        </preCondition>
      </preConditions>
    </outboundRules>
  </rewrite>
  <caching enabled="false" enableKernelCache="false" />
</system.webServer>

Во время исследования этой проблемы я обнаружил вопрос с накопленным переполнением, в котором упоминался атрибут rewriteBeforeCache="true" в теге outboundRules, а также этот пост в блоге, в котором рассказывалось о том же, с чем я столкнулся при проблемах с длиной содержимого.

Если я изменяю этот атрибут, это приводит к тому, что исходящие правила перестают работать.

Сценарий 2 (Исходящие правила не работают):

Так что из-за предшествующей информации я начал настраивать web.config и смог устранить несоответствие длины содержимого с помощью атрибута rewriteBeforeCache в теге outboundRules. Чтобы этот атрибут работал, я смог снова включить кеширование. Это исправило несоответствие длины отклика из сценария 1, но теперь ни один из элементов outboundRules\rule не работает. Я пробовал ряд простейших правил, и они прекрасно работают, когда я удаляю атрибут rewriteBeforeCache, но это вызывает сценарий 1:

<system.webServer>
  <rewrite>
    <urlCompression doStaticCompression="false" doDynamicCompression="true" dynamicCompressionBeforeCache="false" />
    <modules runAllManagedModulesForAllRequests="true" />
    <outboundRules rewriteBeforeCache="true">
      <rule name="Remove .aspx from links in the response" preCondition="IsHTML" stopProcessing="false">
        <match filterByTags="A, Area, Base, Form, Frame, IFrame, Link, Img, Script" pattern="(.*)\.aspx(\?.*)?$" />
        <action type="Rewrite" value="{R:1}{R:2}" />
      </rule>
      <preConditions>
        <preCondition name="IsHTML">
          <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" />
        </preCondition>
      </preConditions>
    </outboundRules>
  </rewrite>
</system.webServer>

Сценарий 1 вызывает одну ошибку с браузерами в IIS7; Сценарий 2 приводит к прекращению работы исходящих правил.

Я изменил любое количество опций, отключив кэширование, передачи в режиме чанка и попробовав каждую комбинацию, которую я могу попробовать.

Дополнительные примечания по AppPool: IIS7, .NET4.0, классический конвейер

У кого-нибудь еще есть какие-либо идеи относительно того, какие еще варианты у меня есть, помимо перехода на сервер IIS7.5?

0 ответов

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