Cloudfront - 同一发行版的多个来源

时间:2015-10-03 13:34:48

标签: amazon-cloudfront

我在使用多个来源的云端工作时遇到了问题。

我有两个来源:

ORIGIN 1

路径: 默认(*)

产地: Custom-example1.com/p

ORIGIN 2

路径: ns /

产地: Custom-example2.com/Produtos

我可以访问原始和默认的原点,但不能访问第二个。

我有一个来自我想要访问的第二个来源的图像:

http://example2.com/Produtos/06/D12-1365-006/D12-1365-006_detalhe1.jpg

如何通过第二个来源访问图像?

我的网站是cdn.mysite.com。

1 个答案:

答案 0 :(得分:8)

CloudFront提供了两个与url-path相关的机制。

一种是缓存行为path pattern,它定义了哪些路径被路由到哪些来源。

路径模式/foo/*将使用原始请求中的路径将所有与/foo/*匹配的请求发送到指定的源,因此传入请求的GET /foo/bar将按原样发送,GET /foo/bar关于对原点的传出请求

...除非......路径由origin path修改,后者在每个去往原点的传出请求的开头添加前缀。

如果上面的原点的原始路径为/baz,那么对原点的传出请求将为GET /baz/foo/bar

然后,没有删除路径组件的机制 - 仅用于添加它们。

在将请求转发到源之前,没有配置选项可以删除路径的组件。如果GET /foo/bar应作为GET /bar转发到原点... CloudFront目前不具备该功能。

CloudFront本身无法删除或重写将发送到原点的路径,但Lambda@Edge会这样做。 Lambda @ Edge是CloudFront功能,允许您配置在请求处理期间在4个不同点触发的触发器,并使用Node.js中编写的代码修改请求的部分(包括路径和标头)或响应(标头)

CloudFront创建表示请求属性的数据结构并调用Lambda函数,将结构作为event参数传递。 Lambda函数的响应会相应地修改CloudFront行为。

有4个触发点。您可以在每个缓存行为中使用它们的任意组合。

    完成缓存行为路径模式匹配的初始匹配后,但在检查缓存之前,会触发
  • 查看器请求触发器。在这里,您可以检查来自浏览器的传入请求,修改路径和标题,甚至 - 根据请求的内容 - 直接从Lambda函数生成一个简单的响应,该函数返回到浏览器而无需进一步处理通过CloudFront。修改此处的路径将更改CloudFront用于缓存查找的路径,但不会导致CloudFront选择其他缓存行为。检查缓存后,如果缓存命中,可能会向查看器返回响应,或者可能会在CloudFront内继续处理。
  • Origin Request 会在请求发送到源之前,在CloudFront没有对象的缓存副本时触发。可以在此处修改路径和标头,并且如果需要,可以直接生成简单响应,而无需将请求发送到源。即使您重写路径,此触发器也不会导致缓存行为选择发生更改。当需要路径重写时,这通常是最具成本效益的触发器,因为它仅在对象尚未在缓存中时触发。 (相比之下,查看器请求触发器会针对每个请求触发。)
  • 原点响应会在对象缓存并返回给查看器之前触发响应从原点返回时触发。在这里,您仍然可以检查原始请求,但修改它已经太晚了。您可以修改响应标头。这对于不设置所需Cache-Control标题的来源特别有用。此处设置Cache-Control标头会影响CloudFront和浏览器缓存行为。此触发器不会触发错误,仅触发具有HTTP状态代码的原始响应< 400。
  • 查看器响应会在CloudFront将对象返回给查看器之前触发,无论是从源中新获取还是从缓存提供。响应标头可以修改。

对于此处讨论的应用程序,解决方案需要Lambda @ Edge Origin Request 触发器,以在选中缓存后从请求路径中删除已知前缀,但是之前将请求发送到源服务器。