2016-02-05 108 views
2

我已经为默认行为(无缓存)设置了cloudfront,elb和我的ec2 web服务器,一切工作正常。只有1个原点(elb),原点路径是空的。 现在我想从web服务器(wildfly)像js/css那样缓存静态的东西,它们都在/ my-context/assets文件夹中提供cloudfront无法请求对象的行为

因此,我添加了一个新的行为与路径模式'/ my-context/assets/*'和使用相同原点的默认缓存设置。 这不工作,我的请求登录页面返回页面html本身,但所有的CSS/JS失败。请求/my-context/assets/a/b/some.css返回502,“CloudFront无法连接到原始地址”。

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

我能说明如何使这项工作?或者这实际上是不可行的?

谢谢!

+0

你绝对不需要第二个来源,并将原始路径设置为任何* prepends *由浏览器发送到请求路径的原始路径,因此您也不需要它。在第一种情况下(2种行为,1种起源),您是否已将“Host:”标题列入了您希望启用缓存的新行为的白名单? –

+0

它的工作!谢谢! – klc

+0

我会将其作为回答发布,如果您确认 - 您需要在新行为中将“Host:”标题列入白名单,对吧? –

回答

1

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

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

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

对于CloudFront的与您的起源通信时使用HTTPS,证书中的域名必须符合下列值中的一个或两个:

•您为原产地域名指定的值您分配中的适用来源。

•如果您将CloudFront配置为将主机标头转发到您的原始主机标头的值。

来源上的SSL/TLS证书在“公用名称”字段中包含域名,可能还有其他几个字段在“主题备用名称”字段中。 (CloudFront在证书域名中支持通配符)。如果您的证书不包含任何与Host域名或Host头域域名匹配的域名,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提供的两种保护之一(当然,其他保护是实际的流量加密)。