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] 中删除已知前缀=] 检查缓存,但 在 请求发送到源服务器之前。
我在使云端与多个来源一起工作时遇到问题。
我有两个出身:
来源 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] 中删除已知前缀=] 检查缓存,但 在 请求发送到源服务器之前。