更简洁优雅的解决方案:
注意:文件扩展名
.gzip
似乎很奇怪,一般来说,我们将gziped文件命名为
.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
-
gzip文件
这四个条件必须同时满足。
如果发送未压缩文件
Content-Encoding: gzip
,浏览器将返回错误;
如果您发送的压缩文件没有
内容编码
页眉或不匹配的MIME类型,页面可能会返回一些天顶星的文本。
因此,我们正在做的是:
-
重新定义每种类型的gzip文件的MIME
-
如果客户端接受gzip文件,则将响应文件重定向到gzip版本
直接在服务器端
(不是302/303/307响应)
-
重写的响应标头的标头
内容编码
,
仅当客户端发送标头时
接受编码
这个解决方案适用于我的IIS7,不确定它是否也适用于IIS10。
如果您遇到任何问题,请告诉我:D