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

Posted

技术标签:

【中文标题】Angular 的 PRE-Gzipped 文件不是通过 IIS 提供的吗?【英文标题】:Angular's PRE-Gzipped files are not served via IIS? 【发布时间】:2017-07-19 19:14:31 【问题描述】:

我已经准备好所有设置(在我家,Windows 10),用于创建和提供 js 作为 gz 文件,但仍然 - 我只得到常规的 js 文件(具有原始大小)。

配置

——Angular 的 webpack 文件:

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

该配置的输出文件:

——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 时,我会得到完整大小的文件:

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

问题

为什么不提供 GZ 文件?


附加信息:

没有304响应,我设置了。 在我的 work、windows 7same 文件中 - 我确实(!)看到了 gzip 文件:

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

因为我不想要实时压缩,而是预压缩(已经被 angular 压缩的文件) - 我尝试启用和禁用压缩(只是想看看它是否会影响某些东西 - 但它不会 - 我仍然得到大文件):

【问题讨论】:

嗨@yurzui,是的,但我不想要动态的 Gzipped 文件。 webpack 已经为我创建了它们,但出于某种原因,在我的 win10 PC 中 - 它不提供 GZ 文件,而在我的工作中 - (win7) - 它提供了 @yurzui 这是我的config file @yurzui 感谢您的努力。仍然无法正常工作-但请阅读我的最新评论(对答案),我发现它实际上从未提供过我的文件,而是提供了生成的文件。 i.stack.imgur.com/pOiwK.png 【参考方案1】:

好的。经过大量搜索 - 我已经设法使用 URLREWRITE 和一些 IIS 配置来做到这一点。

首先 - 我已经禁用了这个:

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

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

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

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

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

这是配置文件:

<?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 类型中:

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

更深入:

这是我预先准备好的:

就是这样。

【讨论】:

hmmmm,如果我想预编译我网站的所有文件,包括 css、html 怎么办?我们不能设置相同的分机。两个 mime 类型的名称,有什么解决方法吗? 一个最优秀的答案。对我来说效果很好。谢谢你。如果有提供 gziped css 和 html 的解决方法,我也很感兴趣。我创建了一个单独的重写规则,但@LossesDon 是正确的,没有任何方法可以修复设置为我可以看到的应用程序/javascript 的 MIME 类型。我猜对此无能为力。 @mikeo 嘿,看看我在另一个问题下的回答:***.com/questions/48889701/…【参考方案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)
    

【讨论】:

正如我已经提到的 - 在我的带有 IIS 的 windows 7 中 - 它确实为 GZ 文件提供服务。我也在我的问题中展示了它(有一张图片)。 i.stack.imgur.com/5NXzD.png 。我也没有在这里使用任何 C#。它是带有 2 个脚本的纯 html 文件。 对此感到抱歉.. 在 IIS 7.5 中有:***.com/questions/6938713/… 但它对您没有帮助,因为您正在查看预压缩文件并且不允许 IIS 为您实时压缩它们... 无论如何,您不应该纠结于此,因为您正在寻找提供预压缩文件的服务。我曾经在我的 .net 核心应用程序中做过同样的事情,并且解决方法很完美.. @RoyiNamir As I've already mentioned - in my windows 7 with IIS - it does serve the GZ files. 这并不意味着 IIS 服务于 您的 gzip 文件,而是内置压缩模块(您不想要)工作。跨度> 这个答案有不相关的代码!我的网站是纯 html + js,没有任何服务器端代码。而且没有中间件。

以上是关于Angular 的 PRE-Gzipped 文件不是通过 IIS 提供的吗?的主要内容,如果未能解决你的问题,请参考以下文章

所需的请求部分“文件”不存在 - Angular 4

Js文件在Angular项目中导入时不起作用

Angular js/MVC 中的文件拖放功能不起作用

Angular向我不想要的.js文件请求添加一个随机数

.SCSS 文件 Angular CLI 中的数学计算不起作用

Ionic3 Angular 不允许从视频播放器(Android 和 iOS)访问本地视频文件