angular - 设置 IIS10 以提供预压缩文件

标签 angular iis gzip http-compression

我的 angular2 项目为我的 web 应用程序构建了预压缩的 gzip 文件,但我的 IIS 只提供普通的“.js”文件而不是压缩的“.gzip”文件。我的浏览器愿意接受 gzip。

IIS 允许 gzip 响应的正确设置是什么?

我已经搜索了 google/SO/SU,但只找到了非“预压缩”内容的解决方案。

最佳答案

一个更简洁优雅的解决方案:
注意:文件扩展名 .gzip看起来很奇怪,一般来说,我们将 gzip 文件命名为 .gz ,所以在这个例子中,我们使用 .gz相反 .gzip ,如果你坚持.gzip ,只需替换以下配置文件中的所有扩展名。

代码第一,这就是我们所需要的 web.config

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <staticContent>
      <remove fileExtension=".js.gz" />
      <remove fileExtension=".css.gz" />
      <remove fileExtension=".png.gz" />
      <remove fileExtension=".jpg.gz" />
      <remove fileExtension=".gif.gz" />
      <remove fileExtension=".svg.gz" />
      <remove fileExtension=".html.gz" />
      <remove fileExtension=".json.gz" />
      <mimeMap fileExtension=".js.gz" mimeType="application/javascript" />
      <mimeMap fileExtension=".css.gz" mimeType="text/css" />
      <mimeMap fileExtension=".png.gz" mimeType="image/png" />
      <mimeMap fileExtension=".jpg.gz" mimeType="image/jpeg" />
      <mimeMap fileExtension=".gif.gz" mimeType="image/gif" />
      <mimeMap fileExtension=".svg.gz" mimeType="image/svg+xml" />
      <mimeMap fileExtension=".html.gz" mimeType="text/html" />
      <mimeMap fileExtension=".json.gz" mimeType="application/json" />
    </staticContent>
  
    <rewrite>
      <outboundRules rewriteBeforeCache="true">
        <rule name="Custom gzip file header">
          <match serverVariable="RESPONSE_CONTENT_ENCODING" pattern=".*" />
          <conditions>
            <add input="{REQUEST_URI}" pattern="\.gz$" />
          </conditions>
          <action type="Rewrite" value="gzip"/>
        </rule>
      </outboundRules>
      
      <rules>
        <rule name="Rewrite gzip file">
          <match url="(.*)"/>
          <conditions>
            <add input="{HTTP_ACCEPT_ENCODING}" pattern="gzip" />
            <add input="{REQUEST_FILENAME}.gz" matchType="IsFile" />
          </conditions>
          <action type="Rewrite" url="{R:1}.gz" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>

而且,这是它的工作原理:
为了实现成功的 gziped 数据传输,我们需要:
  • 客户端接受 gziped 数据,Accept-Encoding
  • 带有 Content-Encoding header 的响应
  • 正确的 MIME 类型,就像原始文件一样,但不是 application/gzip
  • 压缩文件

  • 这四个条件必须同时满足。
    如果您使用 Content-Encoding: gzip 发送未压缩的文件,浏览器会返回错误;
    如果您发送没有 Content-Encoding 的压缩文件头,或不匹配的 MIME 类型,页面可能会返回一些 Zenith Star 的文本。
    所以我们正在做的是:
  • 重新定义每种类型的 gzip 文件的 MIME
  • 如果客户端接受 gziped 文件,则将响应文件重定向到 gziped 版本 直接在服务器端 (不是 302/303/307 响应)
  • 重写Content-Encoding的响应头的header , 仅当客户端发送 header Accept-Encoding

  • 此解决方案适用于我的 IIS7,不确定它是否也适用于 IIS10。
    如果您遇到任何问题,请告诉我:D

    关于angular - 设置 IIS10 以提供预压缩文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48889701/

    相关文章:

    javascript - 重定向到 Angular 5 中动态生成的 html

    asp.net - ASP.NET的Comet实现?

    security - 应用程序池身份、用户组和 iis 隔离

    c# - IIS 8.5 ScriptResource.axd 500 错误和 Sys 未定义

    javascript - 如何禁用多选下拉列表中的 2 个选项并使该选项变灰

    javascript - Angular 中带有嵌套 FormArray 的 p 表中的可扩展行

    angular - 将 max 与选择器一起使用

    linux - dd 磁盘镜像 - 何时使用哪个 conv 开关?

    php - 当我尝试使用 PHP 对 .js 文件进行 GZIP 压缩时,出现了某种与 PHP 相关的错误

    python - 如何压缩一个大文件?