【问题标题】:Amazon EC2 serves gzipped JavaScript. But Cloudfront does not. Why?Amazon EC2 提供 gzip 压缩的 JavaScript。但 Cloudfront 没有。为什么?
【发布时间】:2015-03-28 19:40:54
【问题描述】:

我有一个 Amazon EC2 Web 服务器实例,当 Accept-Encoding 标头设置为 gzip 时,它提供 gzip 压缩的内容。但是,当我向具有作为我的 Amazon EC2 实例的源服务器的 CloudFront CDN 发出具有完全相同标头的相同请求时,它不会发回压缩后的响应。

我还尝试创建一个新的 CloudFront 分配(因为我认为旧的分配可能缓存了未压缩的响应),然后发出相同的请求,我仍然得到未压缩的响应。

谁能告诉我我可能缺少什么?

【问题讨论】:

    标签: amazon-ec2 gzip amazon-cloudfront


    【解决方案1】:

    这已被标记为与 S3 相关的问题的可能重复项。问题是关于 EC2 - 而不是 S3,所以我不认为这是重复的。

    您可能会看到此问题,因为 Cloudfront 在向您的源服务器发出的请求中添加了 ‘Via’ 标头 - 这是 IIS 的一个已知问题。

    如果您要查看传入源的 HTTP 请求,您会在 HTTP 标头中看到如下内容:

    Via=1.1 9dc1db658f6cee1429b5ff20764c5b07.cloudfront.net (CloudFront)
    X-Amz-Cf-Id=k7rFUA2mss4oJDdT7rA0HyjG_XV__XwBV14juZ8ZAQCrbfOrye438A==
    X-Forwarded-For=121.125.239.19, 116.127.54.19
    

    添加“Via”标头是标准代理服务器行为。当 IIS 看到这一点时,它会放弃 gzip 加密(我猜测是因为旧的代理服务器无法处理压缩内容的假设)。

    如果您对 applicationHost.config 进行以下更改,您应该纠正该问题:

    <location path="Your Site">
      <system.webServer>
        <httpCompression noCompressionForHttp10="false" noCompressionForProxies="false" />
      </system.webServer>
    </location>
    

    另一个需要注意的问题是 IIS 并不总是压缩它收到的给定资源的第一个响应,因此,Cloudfront 可能会向源发出请求、接收、缓存,然后提供未压缩版本的内容给后续的访客。同样,您可以使用 applicationHost.config 中的 serverRuntime 设置修改此行为:

    <location path="Your Site">
      <system.webServer>
        <httpCompression noCompressionForHttp10="false" noCompressionForProxies="false" />
        <serverRuntime frequentHitThreshold="1" frequentHitTimePeriod="00:00:05"       />
      </system.webServer>
    

    有关这些设置的更多详细信息,请点击此处: http://www.iis.net/configreference/system.webserver/serverruntime http://www.iis.net/configreference/system.webserver/httpcompression

    感谢这篇博文解释了这个问题: http://codepolice.net/2012/06/26/problems-with-gzip-when-using-iis-7-5-as-an-origin-server-for-a-cdn/

    【讨论】:

    • Windows中的平台和服务器是IIS。问题是当域名是服务器时,服务器提供压缩文件。但是当域名是 Cloudfront CDN 时,提供的文件不会被 gzip 压缩。对服务器的直接请求和对 CDN 的请求都将 Accept-Encoding 标头设置为 gzip, deflate, sdch
    • 嗨@pa669 - 这解决了你遇到的问题吗?
    • 嗨,马克。对不起,我出去了一段时间。所以没有尝试解决方案。将尝试尽快恢复。谢谢。
    • 嘿@mark。对于非常延迟的回复真的很抱歉。上面的解决方案没有帮助。