Более изящное и элегантное решение:
ВНИМАНИЕ: расширение файла .gzip
кажется странным, в общем, мы называем файл gziped как .gz
, поэтому в этом примере мы используем .gz
вместо .gzip
, если вы настаиваете на .gzip
, просто замените все расширения в следующем файле конфигурации.
Сначала код, это все, что нам нужно для web.config
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<staticContent>
<remove fileExtension=".js.gz" />
<remove fileExtension=".css.gz" />
<remove fileExtension=".png.gz" />
<remove fileExtension=".jpg.gz" />
<remove fileExtension=".gif.gz" />
<remove fileExtension=".svg.gz" />
<remove fileExtension=".html.gz" />
<remove fileExtension=".json.gz" />
<mimeMap fileExtension=".js.gz" mimeType="application/javascript" />
<mimeMap fileExtension=".css.gz" mimeType="text/css" />
<mimeMap fileExtension=".png.gz" mimeType="image/png" />
<mimeMap fileExtension=".jpg.gz" mimeType="image/jpeg" />
<mimeMap fileExtension=".gif.gz" mimeType="image/gif" />
<mimeMap fileExtension=".svg.gz" mimeType="image/svg+xml" />
<mimeMap fileExtension=".html.gz" mimeType="text/html" />
<mimeMap fileExtension=".json.gz" mimeType="application/json" />
</staticContent>
<rewrite>
<outboundRules rewriteBeforeCache="true">
<rule name="Custom gzip file header">
<match serverVariable="RESPONSE_CONTENT_ENCODING" pattern=".*" />
<conditions>
<add input="{REQUEST_URI}" pattern="\.gz$" />
</conditions>
<action type="Rewrite" value="gzip"/>
</rule>
</outboundRules>
<rules>
<rule name="Rewrite gzip file">
<match url="(.*)"/>
<conditions>
<add input="{HTTP_ACCEPT_ENCODING}" pattern="gzip" />
<add input="{REQUEST_FILENAME}.gz" matchType="IsFile" />
</conditions>
<action type="Rewrite" url="{R:1}.gz" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
И вот как это работает:
Для успешной передачи данных в формате gziped нам необходимо:
- Клиентская сторона принимает данные в формате gziped,
Accept-Encoding
- Ответ с заголовком
Content-Encoding
- Правильный тип MIME, как и исходный файл, НО НЕ
application/gzip
- Gziped файл
Четыре условия должны выполняться одновременно.
Если вы отправите несжатый файл с Content-Encoding: gzip
, браузер вернет ошибку;
Если вы отправляете сжатый файл без заголовка Content-Encoding
или несоответствующего типа MIME, страница может вернуть текст Zenith Star.
Итак, что мы делаем:
- Переопределите каждый тип MIME файла gziped
- Если клиентская сторона принимает файл gziped, перенаправьте файл ответа в версию gziped на стороне сервера напрямую (а не ответ 302/303/307)
- Перепишите заголовок ответа
Content-Encoding
, только если клиентская сторона отправит заголовок Accept-Encoding
Это решение работает на моем IIS7, не уверен, будет ли оно работать и на IIS10.
Если вы столкнулись с какой-либо проблемой, дайте мне знать: D
person
Losses Don
schedule
17.03.2018