CloudFront 缓存,"request.uri" 可以作为缓存键的一部分吗?

CloudFront cache, can "request.uri" be part of the cache key?

我已经阅读了云端的缓存密钥文档:

https://aws.amazon.com/blogs/networking-and-content-delivery/amazon-cloudfront-announces-cache-and-origin-request-policies/

我有一个由查看器请求触发的 lambda@edge 函数。我将 request.uri 设置为我需要从 S3 获取正确文件的值。

从文档中我没有看到任何关于 request.uri 是缓存键考虑的一部分的内容。

有没有办法让request.uri影响缓存键?

In Lambda@Edgerequest.uri(其中request对象是event.Records[0].cf.request)是请求URL的资源(路径)组成部分,包括文件名和扩展名。

这是缓存键的始终部分。这是默认行为,无法禁用。

By default, [the cache key] consists of the CloudFront distribution hostname and the resource portion of the request URL (path, file name, and extension)

https://aws.amazon.com/blogs/networking-and-content-delivery/amazon-cloudfront-announces-cache-and-origin-request-policies/

...但是,这不是完整的答案。

request.uri 的值可以通过查看者请求修改 and/or 原始请求触发器...所以这里的一个重要考虑因素是 是这个值评估以确定缓存键?

如果触发器是查看器请求触发器,则缓存键使用触发器运行后 request.uri 的值 。这意味着如果查看器请求触发器修改 request.uri 的值(并且 returns 修改后的 request 对象到 CloudFront),则缓存键被修改为包含修改后的值。缓存查找在查看器请求触发器完成并且 returns 控制 CloudFront 后立即发生。

原始请求触发器中的情况非常不同。在原始请求触发器中修改 request.uri 不会更改缓存键(此时已完全冻结,因为已经检查了缓存并且可缓存的响应将存储在生成缓存未命中的同一缓存键下).原始请求触发器运行前的值 是缓存键中的内容。

在任一触发器类型中更改 request.uri 也会更改源服务器接收的请求 URI。