Amazon cloudfront cloudfront无法请求行为中的对象

Amazon cloudfront cloudfront无法请求行为中的对象,amazon-cloudfront,Amazon Cloudfront,我已经为默认行为(无缓存)设置了cloudfront、elb和ec2 web服务器,一切正常。只有一个原点(elb),且原点路径为空。 现在我想用cloudfront从web服务器(wildfly)缓存静态内容,比如js/css,它们都在/my context/assets文件夹中提供 因此,我添加了一个新的行为,路径模式“/mycontext/assets/*”和使用相同来源的默认缓存设置。 这不起作用,我的请求登录页面返回页面html本身,但所有css/js都失败。请求/my context

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

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

我还尝试为新行为设置路径为“/my context/assets”的新原点(具有相同的elb),但也失败了

我可以得到如何使这项工作的指导吗?或者这实际上是不可能的


谢谢大家!

解决方案是将缓存行为配置为从传入请求将
主机:
头转发(白名单)到源站

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

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

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

•您为发行版中适用的来源指定的来源域名值

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

您的源站上的SSL/TLS证书在“公共名称”字段中包含一个域名,在“主题替代名称”字段中可能包含多个域名。(CloudFront支持证书域名中的通配符。)如果您的证书不包含任何与源域名或主机头中的域名匹配的域名,CloudFront将向查看器返回HTTP状态代码502(坏网关)

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

稍后,当您尝试配置第二个缓存行为以便可以缓存与特定路径模式匹配的对象时,您自然不会将所有头转发到源站——但在本例中,转发
主机:
头(CloudFront将其称为转发头的“白名单”)是必要的,因为CloudFront似乎需要这些信息来验证源服务器提供的证书

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


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

您肯定不需要第二个原点,将原点路径设置为任意值都会将原点路径预先设置为浏览器发送的请求路径,因此您也不希望这样。在第一个场景(2个行为,1个来源)中,您是否将
主机:
头白名单列在要为缓存启用的新行为上?如果您愿意确认,我会将其作为答案发布--您需要将
主机:
头白名单列在新行为中,对吗?