Cloudfront - 同一分布的多个来源

Cloudfront - multiple origins on same distribution

我在使云端与多个来源一起工作时遇到问题。

我有两个出身:

来源 1

路径: 默认 (*)

来源: 自定义示例 1.com/p

起源 2

路径: ns/

来源: 自定义示例2.com/Produtos

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

例如,我有一张来自第二个来源的图像,我想访问:

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

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

我的站点是 cdn.mysite.com。

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

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

路径模式 /foo/* 将使用原始请求中的路径将匹配 /foo/* 的所有请求发送到指定来源,因此传入请求的 GET /foo/bar 将被发送 as-is, GET /foo/bar 对源的传出请求

...除非...路径被 origin path 修改,它会在每个到源的传出请求的开头添加前缀。

如果上述源的源路径为 /baz,则对源的传出请求将为 GET /baz/foo/bar

因此,没有删除路径组件的机制——只能添加它们。

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

CloudFront 本身无法删除或重写将发送到源的路径,但 Lambda@Edge 可以。 Lambda@Edge 是一项 CloudFront 功能,允许您配置在请求处理期间在 4 个不同点触发的触发器,并修改部分请求(包括路径和 headers)或响应 (headers) , 使用 Node.js.

中编写的代码

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

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

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

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