Amazon EC2提供gzip压缩JavaScript。但Cloudfront却没有。为什么?

时间:2015-01-29 14:27:16

标签: amazon-ec2 gzip amazon-cloudfront

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

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

有人可以告诉我可能缺少什么吗?

1 个答案:

答案 0 :(得分:0)

这已被标记为与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/