我准备了所有设置(在我的家中,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
})
- 该配置的输出文件:
- 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文件?
其他信息:
答案 0 :(得分:5)
行。经过大量搜索 - 我已经成功地使用URLREWRITE
和一些IIS配置。
首先 - 我已禁用此功能:
因为我这里不需要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类型:
现在,正如您所看到的那样,我确实得到了合适的尺寸:
更进一步:
我所预测的是:
就是这样。
答案 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)
}
}