Angular的PRE-Gzipped文件不能通过IIS提供?

时间:2017-07-19 19:14:31

标签: javascript angular iis gzip

我准备了所有设置(在我的家中,Windows 10)来创建和提供js gz个文件,但仍然 - 我只获得常规js个文件(< em>原始大小)。

  

配置

- Angular的webpack文件:

new CompressionPlugin({
      asset: "[path].gz[query]",
     algorithm: "gzip",
     test: /\.js$|\.css$|\.html$/,
     threshold: 10240,
     minRatio: 0.8
 })

- 该配置的输出文件:

enter image description here

- Index.html文件:

...
<body>
  <app-root>Loading...</app-root> 
  <script src="/dist/polyfills.bundle.js"></script>
  <script src="/dist/main.bundle.js"></script>
</body>
...
  

诊断

当我导航到http://kkk.com/index.html时,我会收到完整尺寸的文件:

enter image description here

另外 - 查看请求标头,我发送Accept-Encoding:gzip, deflate标头:

enter image description here

问题

为什么不提供GZ文件?

其他信息:

  • 没有304回复,我设置enter image description here
  • 工作,windows 7 相同文件中 - 我做(!)查看gziped文件:

enter image description here

  • 已禁用防病毒
  • 权限:所有人:完全控制文件夹。
  • 请求标头之间的比较:

enter image description here

  • 因为我不想要实时压缩,但是PRE-ZIPPING(已经通过角度gzip压缩的文件) - 我尝试启用AND禁用压缩(只是为了看它是否会影响某些东西 - 但它没有 - 我仍然得到大文件):

enter image description here

2 个答案:

答案 0 :(得分:5)

行。经过大量搜索 - 我已经成功地使用URLREWRITE和一些IIS配置。

首先 - 我已禁用此功能:

enter image description here

因为我这里不需要CPU。我已经预先压缩文件。

好的 - 这里的关键是这两个部分:

1)设置contentType to application/javascript
2)将contentEncoding设置为gzip。

所以我写了这两条urlrewrite规则:

第一部分是将所有js个文件重写为js.gz,而outboundrule的第二个规则是content encoding标题添加gzip值。

这是配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <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>
            <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>
    <urlCompression doStaticCompression="false" />
</system.webServer>

将其粘贴到web.config文件中(即使您不使用Asp.net)。

另外 - 你必须将它添加到mime类型:

enter image description here

现在,正如您所看到的那样,我确实得到了合适的尺寸:

enter image description here

更进一步:

enter image description here

我所预测的是:

enter image description here

就是这样。

答案 1 :(得分:2)

IIS不支持预压缩文件。 通过使用此处的解决方案,您可以相当简单地工作: https://github.com/aspnet/StaticFiles/issues/7

问题是IIS按原样提供内容,或者然后压缩并添加编码头。

如果您将静态压缩添加到IIS,它将第二次gzip您的文件。 如果您不添加静态压缩,它将按原样发送它们,但不会添加编码标题。

所以你想要的是劫持请求并以语法方式操纵响应。

这是一个OWIN基础实现示例。 您可以轻松地使用旧版本的HTTP处理程序..

class Startup
{
    private StaticFileOptions StaticFileOptions
    {
        get
        {
            return new StaticFileOptions
            {
                OnPrepareResponse = OnPrepareResponse
            };                
        }
    }

    private void OnPrepareResponse(StaticFileResponseContext context)
    {
        var file = context.File;
        var request = context.Context.Request;
        var response = context.Context.Response;

        if (file.Name.EndsWith(".gz"))
        {
            response.Headers[HeaderNames.ContentEncoding] = "gzip";
            return;
        }

        if (file.Name.IndexOf(".min.", StringComparison.OrdinalIgnoreCase) != -1)
        {
            var requestPath = request.Path.Value;
            var filePath = file.PhysicalPath;

            if (IsDevelopment)
            {
                if (File.Exists(filePath.Replace(".min.", ".")))
                {
                    response.StatusCode = (int)HttpStatusCode.TemporaryRedirect;
                    response.Headers[HeaderNames.Location] = requestPath.Replace(".min.", ".");
                }
            }
            else
            {
                var acceptEncoding = (string)request.Headers[HeaderNames.AcceptEncoding];
                if (acceptEncoding.IndexOf("gzip", StringComparison.OrdinalIgnoreCase) != -1)
                {
                    if (File.Exists(filePath + ".gz"))
                    {
                        response.StatusCode = (int)HttpStatusCode.MovedPermanently;
                        response.Headers[HeaderNames.Location] = requestPath + ".gz";
                    }
                }
            }
        }
    }

   public void Configure(IApplicationBuilder application)
   {
        application
            .UseDefaultFiles()
            .UseStaticFiles(StaticFileOptions)
    }
}