gpt4 book ai didi

http - AWS CloudFront - 转发用户代理但不对其进行缓存

转载 作者:可可西里 更新时间:2023-11-01 15:26:52 32 4
gpt4 key购买 nike

我希望我的来源能够看到 User-Agent header 。例如:Gecko/20100101 Firefox/62.0 而不是 Amazon CloudFront .

在“行为”选项卡中,我可以将 User-Agent header 列入白名单,因此它会正确传递到源,但是现在 CloudFront 缓存每个 User-Agent 的内容,这意味着用户从不同的浏览器访问 CloudFront 端点会强制 CloudFront 转到源。

有什么方法可以配置 CloudFront 将一些 header 传递到源,但不一定对它们进行缓存?

编辑:我对 Accept-Language header 有类似的问题。我想将它传递给原点,但我不想对其进行缓存。我正在缓存的 Assets 不依赖于语言,但是不可缓存的内容依赖于 Accept-Language header 。

最佳答案

您可以使用分配给您的 CloudFront 分配的 Lambda@Edge 函数 ( https://docs.aws.amazon.com/lambda/latest/dg/lambda-edge.html)。你需要两个函数:

  1. Viewer-Request 事件处理程序,它将读取 User-Agent header 并将其复制到例如X-My-User-Agent。 Viewer-Request 处理程序在来自客户端的请求到达您的 Cloudfront Distribution 之前被调用。
  2. Origin-Request 事件处理程序,它将读取 X-My-User-Agent 并替换 User-Agent。当 Cloudfront 在其缓存中找不到请求的页面并将请求发送到源时,将调用 Origin-Request 处理程序。

请注意,您不应将 User-Agent 添加到 Cloudfront 白名单:

You can configure CloudFront to cache objects based on values in theDate and User-Agent headers, but we don't recommend it. These headershave a lot of possible values, and caching based on their values wouldcause CloudFront to forward significantly more requests to yourorigin.

引用:https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/RequestAndResponseBehaviorCustomOrigin.html#request-custom-headers-behavior

查看器请求处理程序示例(Lambda@Edge 只能用 NodeJS 或 Python 编写,引用:https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-requirements-limits.html#lambda-requirements-lambda-function-configuration):

'use strict';

exports.handler = (event, context, callback) => {
const request = event.Records[0].cf.request;
const headers = request.headers;
const customUserAgentHeaderName = 'X-My-User-Agent';
const userAgent = headers['user-agent'][0].value;

headers[customUserAgentHeaderName.toLowerCase()] = [
{
key: customUserAgentHeaderName,
value: userAgent
}
];


callback(null, request);
};

Origin-Request 处理程序示例:

'use strict';

exports.handler = (event, context, callback) => {
const request = event.Records[0].cf.request;
const headers = request.headers;
const customUserAgentHeaderName = 'X-My-User-Agent';
const realUserAgent = headers[customUserAgentHeaderName.toLowerCase()][0].value;

headers['user-agent'] = [
{
key: 'User-Agent',
value: realUserAgent
}
];


callback(null, request);
};

关于http - AWS CloudFront - 转发用户代理但不对其进行缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52964794/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com