В приложении IIS отсутствует Content-Encoding - gzip в заголовке ответа

В Firebug заголовок запроса имеет следующую запись:
Accept-Encoding: gzip, deflate

Но нет:
Content-Encoding: gzip
в заголовке ответа.

Независимо от того, что я пробовал, после ряда ответов на SO и других сайтах, похоже, ничего не работает! Ни статические, ни динамические файлы не сжимаются, или, по крайней мере, если они есть, кодировка содержимого отсутствует - значение gzip возвращается в заголовке ответа.

Вот пример моих настроек web.config:

<urlCompression doDynamicCompression="true" doStaticCompression="true" dynamicCompressionBeforeCache="true" />
<httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files" minFileSizeForComp="150" staticCompressionIgnoreHitFrequency="true">
  <remove name="gzip" />
  <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" staticCompressionLevel="8" dynamicCompressionLevel="8" />
</httpCompression>

Я проигнорировал частоту обращений
staticCompressionIgnoreHitFrequency="true "

Я подтвердил, что IIS на самом деле сжимает файлы, которые я вижу в:
C: \ inetpub \ temp \ IIS Temporary Compressed Files

Как указано здесь: настроить gzip в IIS 8 windows 8
Я убедился, что статическое и динамическое сжатие включено в Windows Features> Internet Information Services> WWW Services> Performance Features.

Я также пробовал подход этого парня:
Сжатие IIS 7.5 создает сжатый файл, но возвращает несжатый


Изменить 1:
версия IIS - 10, но я также пробовал это на IIS 8.5.


Редактировать 2:
Теперь я также пробовал различные файлы конфигурации, найденные по этой ссылке: https://github.com/h5bp/server-configs-iis/, в котором представлены файлы web.config, похожие на "лучшие практики".
Не решено < / сильный>


Редактировать 3:
На основе ввода @Nkosi я создал полностью новое приложение Asp.net MVC и настроил его, используя все эти варианты, которые я пробовал. Вот исходный заголовок, который я получил от Fiddler:

HTTP/1.1 200 OK
Transfer-Encoding: chunked
Content-Type: text/javascript; charset=UTF-8
Expires: Wed, 20 Jul 2016 18:22:47 GMT
Last-Modified: Wed, 20 Jul 2016 18:22:47 GMT
Server: Microsoft-HTTPAPI/2.0
Date: Wed, 20 Jul 2016 18:22:47 GMT

Как видите, нет Content-Encoding: Gzip
Не решено


Изменить 4:
Я пробовал этот подход добавления кода к событию BeginRequest в разделе Global.asax: https://stackoverflow.com/a/27185575/392591
Не решено


Изменить 5:
Итак, я просто попытался включить трассировку на основе этого ответа на SO: https://stackoverflow.com/a/33182525/392591
Никаких сбоев, но я заметил, что прямо в нижней части файла трассировки есть раздел GENERAL_RESPONSE_HEADERS, и вот что он предоставляет:

Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
Server: Microsoft-IIS/10.0
X-AspNetMvc-Version: 5.2
X-AspNet-Version: 4.0.30319
X-Powered-By: My Little Pony
X-UA-Compatible: IE=Edge,chrome=1

И это для каждого файла статического типа.
Однако я только что нашел в файле трассировки следующее:

8. STATIC_COMPRESSION_START  08:04:03.552 
9. STATIC_COMPRESSION_NOT_SUCCESS Reason="NOT_FREQUENTLY_HIT" 08:04:03.552 
10. STATIC_COMPRESSION_END  08:04:03.552 

Сжатие не удалось по причине нечасто срабатывания ... Странно, потому что у меня определенно установлено значение параметра «Игнорировать частоту срабатывания» в значение «Истина»!

Поэтому я просто зашел в диспетчер IIS и на сервере установил для параметра Ignore Hit Frequency значение true (т.е. applicationHost.config) и изменил вывод файла трассировки на следующее:

8. STATIC_COMPRESSION_START  08:19:17.489 
9. STATIC_COMPRESSION_SUCCESS  08:19:17.489 
10. STATIC_COMPRESSION_END  08:19:17.489 

Я вернулся и отключил его в applicationHost.config, и он вернулся к Static Compression Not Success, так что это определенно имеет значение. Однако, когда я смотрю на FireBug, он по-прежнему доставляет несжатый файл без заголовка ответа GZIP Content Encoding.

Еще один интересный момент, который я заметил в трассировке неудачных запросов, - это последние два входа GENERAL_FLUSH_RESPONSE_END и GENERAL_REQUEST_END, оба из которых показывают, что мой файл Bootstrap.css отправил 17903 байта, примерно 18 КБ, что соответствует сжатой версии файла, который я вижу в моем IIS Temporary Compressed. Папка с файлами. Таким образом, файл физически сжимается, и, согласно трассировке Failed Request, он отправляет правильный контент ... но вместо этого браузер забирает полный файл размером 117 КБ?
Не решено



person Jacques    schedule 07.07.2016    source источник
comment
Я использую IIS10, а в моем web.config есть только <urlCompression doDynamicCompression="true" doStaticCompression="true" dynamicCompressionBeforeCache="false" />. Когда я делаю тестовые запросы из браузера (Firefox, IE11, Edge, Google Chrome) к простому приложению MVC. Все запросы содержат Accept-Encoding: gzip, deflate, а ответы возвращают Content-Encoding:gzip   -  person Nkosi    schedule 18.07.2016
comment
См. это. Возможно, вам нужно включить функцию gzip на сервере.   -  person Lucas Segers    schedule 19.07.2016
comment
@LucasSegers - функция определенно включена.   -  person Jacques    schedule 20.07.2016
comment
У меня та же проблема, когда трассировка неудачного запроса показывает, что файл был сжат нормально. С правильным заголовком ответа, отображаемым в GENERAL_FLUSH_RESPONSE_START, и правильным размером в GENERAL_REQUEST_END, но браузер по-прежнему принимает полный файл.   -  person yilik01    schedule 21.11.2016
comment
У меня такая же проблема. Был ли когда-нибудь ответ?   -  person MakkyNZ    schedule 30.03.2017
comment
@MakkyNZ не тот, который решил мою проблему, нет.   -  person Jacques    schedule 03.04.2017
comment
@Jacques. Для меня проблема заключалась в том, что антивирус на моей машине удалял заголовок ответа Content-Encoding.   -  person MakkyNZ    schedule 04.04.2017
comment
@Jacques Как упоминал MakkyNZ, наиболее частая причина - антивирус. Я тоже несколько раз сталкивался с этой проблемой. Кажется, что все правильно настроено на стороне сервера / ответа в описанном сценарии, поэтому похоже, что что-то распаковывает сжатые файлы. Даже Fiddler здесь не может помочь, хотя кажется, что помогает Wireshark (похоже, он перехватывает ответ даже на более низком уровне, чем антивирус). Один из быстрых и простых способов обойти антивирус - проверить, заархивирован ли контент при использовании https / SSL.   -  person Neven    schedule 24.05.2017


Ответы (3)


У меня аналогичная ситуация с конфигурацией IIS и gzip

В Firebug заголовок запроса имеет следующую запись: Accept-Encoding: gzip, deflate

Но в заголовке ответа нет: Content-Encoding: gzip.

В моем случае проблема была с антивирусной защитой. Фактически был применен gzipping, но антивирус с включенными настройками защита HTTP-соединений (зависит от конкретной программы), разархивируйте ответ, проверьте его и после этого переписывайте заголовки ответов на лету.

ПРИМЕЧАНИЕ: ключевой атрибут, когда какой-либо прокси / антивирус изменяет заголовки вашего ответа, это когда исчезают Content-Length и Transfer-Encoding добавляется значение фрагментировано.

person RQman    schedule 14.03.2018
comment
Спасибо. Ты спас мне день. Eset nod менял заголовок ответа и разархивировал ответ - person AymAn AbuOmar; 15.01.2020
comment
Похоже, что антивирусные программы перехватывают архив и извлекают его перед передачей в браузер, поэтому браузер всегда будет получать его в несжатом виде, пока он активен. Попробуйте протестировать на машине только с выключенным защитником Windows или антивирусом и посмотрите, получите ли вы кодировку содержимого, тогда - person wnbates; 29.07.2020

Я использую IIS10, и в моем web.config есть

<system.webServer>
    <urlCompression doDynamicCompression="true" doStaticCompression="true" dynamicCompressionBeforeCache="false" />
    <!-- other config removed for brevity -->
</system.webServer>

Когда я делаю тестовые запросы из браузера (Firefox, IE11, Edge, Google Chrome) к простому приложению MVC.

Все запросы содержат Accept-Encoding: gzip, deflate, а ответы возвращают Content-Encoding:gzip.

Я даже тестировал его с помощью Fiddler. Составление запроса вручную

GET http://localhost/MyWebApplication HTTP/1.1
User-Agent: Fiddler
Host: localhost
Accept-Encoding: gzip, deflate

и получите тот же результат

HTTP/1.1 200 OK
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
Vary: Accept-Encoding
Server: Microsoft-IIS/10.0
X-AspNetMvc-Version: 5.2
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Mon, 18 Jul 2016 15:26:06 GMT
Content-Length: 3826

...

Css, Js и все другие текстовые файлы сжимаются.

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

ОБНОВИТЬ:

Я заметил, что изображения не сжимаются

Запрос

GET http://localhost/MyWebApplication/Images/Logo_small.png HTTP/1.1
User-Agent: Fiddler
Host: localhost
Accept-Encoding: gzip, deflate

Ответ

HTTP/1.1 200 OK
Cache-Control: max-age=604800
Content-Type: image/png
Last-Modified: Fri, 27 Nov 2015 03:15:22 GMT
Accept-Ranges: bytes
ETag: "c9d1fdd9c128d11:0"
Server: Microsoft-IIS/10.0
X-Powered-By: ASP.NET
Date: Mon, 18 Jul 2016 15:33:02 GMT
Content-Length: 2970

...

И после того, как какой-то гугл-фу выяснил, что изображения обычно уже сжаты, поэтому gzip не применялся.

ПОЛНЫЙ system.webServer из web.config

  <system.webServer>
    <urlCompression doDynamicCompression="true" doStaticCompression="true" dynamicCompressionBeforeCache="false" />
   <validation validateIntegratedModeConfiguration="false" />
    <httpErrors errorMode="Custom" existingResponse="Replace">
      <clear />
      <error statusCode="404" responseMode="ExecuteURL" path="/NotFound" />
    </httpErrors>
    <handlers>
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <remove name="OPTIONSVerbHandler" />
      <remove name="TRACEVerbHandler" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
    <staticContent>
      <remove fileExtension=".woff" />
      <remove fileExtension=".woff2" />
      <mimeMap fileExtension=".woff" mimeType="application/font-woff" />
      <mimeMap fileExtension=".woff2" mimeType="application/font-woff2" />
      <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="7.00:00:00" />
    </staticContent>
  </system.webServer>
person Nkosi    schedule 18.07.2016
comment
Я обновил свой вопрос, см. Правка 3. Какой код вы удалили из своего примера, что могло изменить мои результаты? - person Jacques; 20.07.2016
comment
@Jacques, остальная часть конфига httpErrors, handler, staticContent. Я оставил это минимальным. Я включу это в обновление. - person Nkosi; 20.07.2016
comment
хорошо, я не думаю, что это повлияет на эту проблему. Я добавил еще одно обновление с другим решением, которое только что попробовал, но все равно без радости. - person Jacques; 20.07.2016

У меня была такая же проблема. Причиной оказалась установка dynamicCompressionBeforeCache="true". Изменение этого атрибута на "false" устранило проблему.

<urlCompression doDynamicCompression="true" doStaticCompression="true" dynamicCompressionBeforeCache="false" />

Я запускаю несколько сайтов на общем сервере, предоставленном SmarterASP.Net. Я поднял с ними заявку в службу поддержки и попутно решил, что виноват dynamicCompressionBeforeCache="true".

Я указал им на документацию Microsoft, посвященную этому атрибуту, по адресу https://docs.microsoft.com/en-us/iis/configuration/system.webserver/urlcompression и спросил их, почему установка "true" вызывает эту проблему.

Служба поддержки SmarterASP.Net сослалась на раздел документации, в котором говорится ...

Если атрибут dynamicCompressionBeforeCache имеет значение true, когда ответ кэша вывода был очищен, динамическое сжатие не будет выполняться до того, как ответ будет помещен в кэш вывода.

... и они сказали ...

«Мы не сохраняем кеш вывода на нашем сервере. Поэтому ответы кэша вывода всегда сбрасывались и вызывали проблему».

Я не могу сказать, что полностью понимаю здесь механизм или почему SmarterASP.Net не сохраняет кеш вывода. Но установка dynamicCompressionBeforeCache="false" определенно решила проблему для меня.

person Tony Gray    schedule 07.08.2019