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?