我们正在使用CloudFront作为我们的静态资产,但也希望允许使用Gzip。 我们build立了一个新的发行版,其中自定义来源指向我们在弹性负载均衡器后面的应用程序服务器。 我们手动保持群集中的文件同步,并在发布时进行更新。
但是,随着这个build立,我们除了CloudFront的小姐和RefreshHits以外,什么都没有,这一直到目前为止已经失败了。 是否有任何额外的设置,以便使用ELB作为您的自定义原点? 在文档中,它将其作为可行的解决scheme。
当我们将分发指向我们的生产集群中的单个服务器时,cloudfront会正确地caching我们的资产。
粘滞会话cookie和随后添加的头可能是一个问题吗?
Cache-Control: no-cache="set-cookie"
//由负载平衡器添加
有任何想法吗?
仅供参考 – 目前,我们有我们的自定义来源指向单个EC2实例,所以caching工作正常 – 万一你试图curl下面的文件。
示例标题:curl -I http://static.quick-cdn.com/css/9850999.css
HTTP/1.0 200 OK Accept-Ranges: bytes Cache-Control: max-age=3700 Cache-Control: no-cache="set-cookie" Content-Length: 23038 Content-Type: text/css Date: Thu, 12 Apr 2012 23:03:52 GMT Last-Modified: Thu, 12 Apr 2012 23:00:14 GMT Server: Apache/2.2.17 (Ubuntu) Vary: Accept-Encoding X-Cache: RefreshHit from cloudfront X-Amz-Cf-Id: K_q7Zy3_jdzlEJ85ukELVtdx1GmuXqApAbZZ7G0fPt0mxRMqPKX5pQ==,RzJmPku-rEIO9WlvuSoKa8hiAaR3dLk5KC4cQMWWrf_MDhmjWe8n6A== Via: 1.0 28c34f9fbf559a21ee16594849e4fc9c.cloudfront.net (CloudFront) Connection: close
CloudFront可能无法正确处理具有相同名称的多个标头,并且没有看到您的max-age
指令。 根据这个 CloudFront使用Expires
头文件(如果存在的话),所以请尝试让原始服务器设置,而不是(最好是相对于请求时间)。 对于Apache我想你想要这样的mod_expires :
ExpiresDefault "access plus 1 hour"
当在ELB上使用粘性会话时,负载均衡器将添加以下两个头信息: Set-Cookie
(带有AWSELB cookie)和Cache-Control: no-cache="set-cookie"
。
如果CF Distro上的min-ttl为0(现在是默认值),则CloudFront将使用no-cache指令。 亚马逊代表与我联系: w3.org – RFC2616 。
来自no-cache部分的以下内容适用于:
如果no-cache指令没有指定一个或多个字段名称,则caching可以使用该响应来满足后续的请求,但是要遵守对caching的任何其他限制。 但是,指定的字段名不得在对后续请求的响应中发送,而不要使用源服务器成功重新生效
但是,根据我的经验,如果设置了no-cache
指令,CloudFront将始终重新validation对象。 我相信,他们实际上应该忽略no-cache
指定的Set-Cookie头,以便开始。
快速解决scheme是创build一个新的CF发行版,并手动指定一个大于0的min-ttl,这似乎覆盖了no-cache
指令。 您需要使用API或第三方程序来执行操作,因为AWS控制台不允许您修改min-ttl。