iis - IIS:有条件地设置和提供 gzip 和 brotli 压缩
问题描述
我想将一些静态内容提供给浏览器,发现与 gzip 相比,Brotli 将最终下载包的大小减少了 43%。
我首先尝试只设置 Brotli,所有现代浏览器都下载压缩文件。但是当尝试使用 IE11(不支持 brotli)时,下载原始内容而不进行任何影响性能的压缩。
为了解决这个问题,我将 Gzip 和 Brotli 都保存在 IIS 上。但是现在所有的浏览器都只下载 Gzip 格式的内容,这很可能是因为请求头的顺序是 gzip 先出现的。
我想让它有条件,以便默认情况下浏览器以 Brotli 格式下载内容,如果浏览器不支持它,则自动切换到 gzip 格式。
知道怎么做吗?
<httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files">
<scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" />
<scheme name="br" dll="%Windir%\system32\inetsrv\brotli.dll" dynamicCompressionLevel="5" staticCompressionLevel="11" />
<dynamicTypes>
<add mimeType="text/*" enabled="true" />
<add mimeType="message/*" enabled="true" />
<add mimeType="application/x-javascript" enabled="true" />
<add mimeType="application/javascript" enabled="true" />
<add mimeType="*/*" enabled="false" />
</dynamicTypes>
<staticTypes>
<add mimeType="text/*" enabled="true" />
<add mimeType="message/*" enabled="true" />
<add mimeType="application/javascript" enabled="true" />
<add mimeType="application/atom+xml" enabled="true" />
<add mimeType="application/xaml+xml" enabled="true" />
<add mimeType="image/svg+xml" enabled="true" />
<add mimeType="*/*" enabled="false" />
</staticTypes>
</httpCompression>
解决方案
您可以启用 Brotli 和 Gzip 压缩的多种压缩方案,并设置压缩方案的优先级。
IIS 提供了一个默认的压缩方案提供程序 gzip,它默认在 applicationHost.config 中注册为 gzip 方案。但是如果你还想使用 Brotli 压缩,则需要在 applicationHost.config 中添加 iisbrotli.dll 作为 Brotli 压缩方案提供程序。添加 Brotli 压缩方案
关于如何设置 Compression Scheme Prioritization,分为 IIS 10.0 Version 1803 或更高版本和 Before IIS 10.0 Version 1803 两个版本。
关于 IIS 10.0 Version 1803 或更高版本,每个压缩方案的优先级由其在元素集合中的顺序决定。
大约在 IIS 10.0 Version 1803 之前,它会根据 Accept-Encoding 请求标头值中出现的方案顺序来优先压缩方案,但对于浏览器设置 Accept-Encoding 的典型场景,IIS 总是优先 gzip 而不是 br:gzip、deflate、 br 请求中的标头。一种可能的解决方法是安装 URL 重写模块并配置重写规则以修改 Accept-Encoding 标头值。 启用多个压缩方案
推荐阅读
- git - git pull/push 无法从/向 github 拉/推,但 git pull/push -vv 可以
- datatables - column().data() 与正交数据而不是显示?
- c# - 当所有文本框在UWP C#中都有值时需要启用按钮
- python - 如何使用 CatBoostClassifier 为不同的输入定义不同的文本处理逻辑
- python - 跨平台 Python 以识别应用程序/进程为重点
- javascript - RxJS Observable - 在使用下一个发射值之前等待异步方法完成
- javascript - Flatpickr range插件问题
- mapstruct - MapStruct 发出映射对象到列表
- keras - 如何计算作为神经网络输入的图像序列的 MSE?
- java - PropertyPlaceHolderConfigurer 替代方案