cloudfront无法在行为中请求对象

时间:2016-02-05 11:14:40

标签: amazon-cloudfront

我已经设置了cloudfront,elb和我的ec2 web服务器以进行默认行为(没有缓存),一切正常。只有1个原点(elb),原点路径为空。 现在我想从web服务器(wildfly)缓存静态内容,如js / css,它们都在/ my-context / assets文件夹中提供

所以我使用相同的来源添加路径模式'/ my-context / assets / *'和默认缓存设置的新行为。 这不起作用,我的请求登录页面返回页面html本身,但所有css / js都失败了。请求/my-context/assets/a/b/some.css返回502,“CloudFront无法连接到原点。”

我还尝试使用路径“/ my-context / assets”为新行为设置一个新的原点(使用相同的elb),它也会失败。

我可以获得如何使这项工作的指示吗?或者这实际上是不可行的?

谢谢!

1 个答案:

答案 0 :(得分:1)

解决方案是配置缓存行为,以便将Host:标头从传入请求转发(白名单)到原点。

这并不意味着它是"正确的"在任何情况下都要配置,但很多时候都是可取的,甚至是必需的。

当CloudFront与您的源服务器建立后端https连接时,服务器提供的证书不仅必须有效(不过期,不能自签名,由受信任的CA颁发,并且具有完整的中间链) )必须是有效的才能满足CloudFront将要发送的请求

  

要让CloudFront在与您的来源通信时使用HTTPS,证书中的某个域名必须匹配以下一个或两个值:

     

•您为分发中适用来源的原始域名指定的值。

     

•如果您将CloudFront配置为将主机标头转发到您的源,则为主机标头的值。

     

您的来源上的SSL / TLS证书在公共名称字段中包含域名,并且可能在“使用者备用名称”字段中包含多个域名。 (CloudFront支持证书域名中的通配符。)如果您的证书不包含与源域名称或主机头中的域名匹配的任何域名,则CloudFront将返回HTTP状态代码502(错误网关)观众。

     

http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/SecureConnections.html#SecureConnectionsHowToRequireCustomProcedure

在您的情况下,您最初通过禁用缓存的CloudFront运行请求,这通常通过配置CloudFront将所有请求标头转发到源来完成,因为这会自动禁用响应的缓存。

稍后,当您尝试配置第二个缓存行为以便可以缓存匹配某些路径模式的对象时,您自然不会将所有标头转发到源 - 但在这种情况下,转发Host:标头( CloudFront称为"白名单"转发标头是必要的,因为CloudFront似乎需要该信息才能验证原始服务器所呈现的证书。

如果您不转发Host:标题,则证书必须与原始域名相匹配,如上所述,在您的情况下,我们显然不是这种情况。如果Host:标头未列入白名单进行转发,则CloudFront仍会在后端请求中发送主机标头,但此标头设置为与源域名相同的值,因此证书必须与之匹配值。

如果不需要以某种方式匹配(以及CloudFront对与源连接的HTTPS连接施加的所有其他条件),这将阻止CloudFront在合理确定的情况下确定后端连接是否由预期处理服务器,并且原始服务器确实是它声称的服务器,这是TLS / SSL提供的两种保护之一(当然,另一种保护是流量的实际加密)。