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 7、same 文件中 - 我确实(!)看到了 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 to
application/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 核心应用程序中做过同样的事情,并且解决方法很完美.. @RoyiNamirAs I've already mentioned - in my windows 7 with IIS - it does serve the GZ files.
这并不意味着 IIS 服务于 您的 gzip 文件,而是内置压缩模块(您不想要)工作。跨度>
这个答案有不相关的代码!我的网站是纯 html + js,没有任何服务器端代码。而且没有中间件。以上是关于Angular 的 PRE-Gzipped 文件不是通过 IIS 提供的吗?的主要内容,如果未能解决你的问题,请参考以下文章