IIS的url-rewrite配置预压缩

参考:https://stackoverflow.com/questions/45199213/angulars-pre-gzipped-files-are-not-served-via-iis
参考:https://stackoverflow.com/questions/40884212/serve-bundle-js-gz-file-on-iis
参考:https://gist.github.com/suhrab/552af7b3383706081fbe51c102c290d7
参考:https://www.iis.net/downloads/microsoft/url-rewrite
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)

Url-Rewrite是什么?

url-rewrite是网页服务器的一项功能:

  1. 入站规则:可以用于重写访问的url路径,可以把符合条件的请求的url路径路由到另一个url路径上去。
  2. 出站规则:可以根据一些条件,如消息的类型,修改返回消息的类型等内容。
    下面是官方的一段解释:
    IIS URL Rewrite 2.1 enables Web administrators to create powerful rules to implement URLs that are easier for users to remember and easier for search engines to find. By using rule templates, rewrite maps, .NET providers, and other functionality integrated into IIS Manager, Web administrators can easily set up rules to define URL rewriting behavior based on HTTP headers, HTTP response or request headers, IIS server variables, and even complex programmatic rules. In addition, Web administrators can perform redirects, send custom responses, or stop HTTP requests based on the logic expressed in the rewrite rules.

Url-Rewrite的安装

url-rewrite缺省是没有安装到IIS服务器上的,使用前,我们需要把它下载安装到电脑上。
可以在这个官方的下载路径上下载一个版本进行安装:
https://www.iis.net/downloads/microsoft/url-rewrite

Url-Rewrite配置预压缩

不同于nginx,IIS是没有支持静态预压缩的。
这里的静态预压缩指:把web服务器上的html/js等资源,使用gzip预先生成一份压缩数据,当请求过来的时候,优先返回这些gzip压缩的文件,这样可以显著的减少传输的数据量,提高传输效率。

实现策略

为了让IIS能够返回gzip压缩的文件,我们可以考虑使用url-rewrite功能。
1. 在请求入站时把请求的文件,添加gz压缩包后缀。目的是:让fetch文件时,直接把.gz的压缩文件对外返回。
2. 在出站时,需要把content-encoding置位gzip,另外也需要把content-type置位 application/octet-stream。置位这些的目的是:如果不修改标识,直接返回gzip文件,浏览器会认为客户请求的就是gzip文件,是要下载gzip文件;而修改标识后,浏览器会识别出这是请求文件的gzip压缩文件,使用前需要解压,浏览器会对它进行解压并传给网页程序进行使用。

配置样例

配置样例参考stackoverflow上的答复:
https://stackoverflow.com/questions/45199213/angulars-pre-gzipped-files-are-not-served-via-iis

在网站跟目录的的web.config文件中修改:
入站配置:识别js后缀的添加.gz后缀

		 <rules>
                <rule name="https" enabled="true" stopProcessing="false">
                    <match url="(.*).js" />
                    <conditions></conditions>
                    <action type="Rewrite" url="{R:1}.js.gz" appendQueryString="true" logRewrittenUrl="true" />
                </rule>
            </rules>

出站配置:.gz后缀的content-encoding修改为gzip

<outboundRules>
                <rule name="Rewrite content-encoding header" preCondition="IsGZ" stopProcessing="false">
                    <match serverVariable="RESPONSE_CONTENT_ENCODING" pattern=".*" />
                    <action type="Rewrite" value="gzip" />
                </rule>
                <preConditions>
                    <preCondition name="IsGZ">
                        <add input="{URL}" pattern="\.gz$" />
                    </preCondition>
        </preConditions>
        </outboundRules>
    </rewrite>

经过上面的配置,就可以实现js文件的预压缩支持。

缺点分析

使用该种策略,一定程度可以在IIS上实现支持预压缩文件,不过毕竟不像nginx的支持,该种变通实现是有一定的副作用的,如果使用的话注意规避该副作用。

  1. 修改后不再找原路径:入站规则直接修改了请求的url,意为着,如果修改后的url路径文件不存在,就会返回404。如果请求不到.gz压缩文件,是不会找原不带.gz的请求文件的。
  2. gz后置被标识为encoding-type为gzip,浏览器收到后会进行解压,这对原来就请求下载gz文件的情况,进行了干扰。请求下载的gz文件,浏览器先解压了,理论上保存就是解压后的文件了。

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

春夜喜雨

稀罕你的喜欢!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值