Http AWS CloudFront-转发用户代理,但不';我不能对它进行缓存
我希望我的源代码能够看到Http AWS CloudFront-转发用户代理,但不';我不能对它进行缓存,http,amazon-cloudfront,user-agent,Http,Amazon Cloudfront,User Agent,我希望我的源代码能够看到用户代理标题。例如:Gecko/20100101 Firefox/62.0而不是Amazon CloudFront 在“行为”选项卡中,我可以将用户代理标题列为白名单,这样它就可以正确地传递到源站,但是现在CloudFront会根据用户代理缓存内容,这意味着从不同浏览器访问CloudFront端点的用户会强制CloudFront转到源站 有没有办法将CloudFront配置为将一些头文件传递给源文件,但不一定对它们进行缓存 编辑: 我在Accept Languagehea
用户代理
标题。例如:Gecko/20100101 Firefox/62.0
而不是Amazon CloudFront
在“行为”选项卡中,我可以将用户代理
标题列为白名单,这样它就可以正确地传递到源站,但是现在CloudFront会根据用户代理
缓存内容,这意味着从不同浏览器访问CloudFront端点的用户会强制CloudFront转到源站
有没有办法将CloudFront配置为将一些头文件传递给源文件,但不一定对它们进行缓存
编辑:
我在
Accept Language
header中遇到了类似的问题。我想将其传递给源,但是我不想对其进行缓存。我正在缓存的资产不依赖于语言,但是不可缓存的内容依赖于接受语言
标题。您可以使用Lambda@Edge函数()已分配给CloudFront发行版。您需要两个功能:
用户代理
标题并将其复制到例如X-My-User-Agent
。查看器请求处理程序在客户端的请求到达Cloudfront发行版之前被调用X-My-User-Agent
并替换User-Agent
。当Cloudfront在其缓存中找不到请求的页面并将请求发送给源时,将调用源请求处理程序用户代理添加到Cloudfront白名单中:
您可以将CloudFront配置为基于中的值缓存对象
日期和用户代理标题,但我们不建议使用它。这些标题
有很多可能的值,基于它们的值进行缓存
使CloudFront将更多的请求转发给您的
起源
参考:
查看器请求处理程序示例(Lambda@Edge只能用NodeJS或Python编写,参考:):
“严格使用”;
exports.handler=(事件、上下文、回调)=>{
const request=event.Records[0].cf.request;
const headers=request.headers;
const customUserAgentHeaderName='X-My-User-Agent';
const userAgent=headers['user-agent'][0]。值;
标题[customUserAgentHeaderName.toLowerCase()]=[
{
关键字:customUserAgentHeaderName,
值:userAgent
}
];
回调(null,请求);
};
源请求处理程序示例:
“严格使用”;
exports.handler=(事件、上下文、回调)=>{
const request=event.Records[0].cf.request;
const headers=request.headers;
const customUserAgentHeaderName='X-My-User-Agent';
const realUserAgent=headers[customUserAgentHeaderName.toLowerCase()][0]。值;
标题['user-agent']=[
{
键:“用户代理”,
值:realUserAgent
}
];
回调(null,请求);
};
如果请求在不同的用户代理之间缓存,在命中的情况下,真正的用户代理将根本不会传递给源。CloudFront将只返回缓存的响应
您提到要将用户代理信息发送到Elasticsearch。除非您只对丢失的请求感兴趣,否则您不能依赖从源应用程序收集的日志
如果你有Lambda@Edge要以realUserAgent
的形式发送用户代理,但用户代理头本身不是缓存参数,如果未命中
,则源站仍不会接收该数据
我在这里看到的唯一解决方案是使用CloudFront生成的访问日志。CloudFront访问日志不仅包含用户代理,还包含IP地址和其他有用信息。记录命中和未命中的数据。设置日志存储将此信息发送到Elasticsearch也很容易
- [1]
- [2]
这可能是一个简单的解决方案。如果您希望用户代理用于唯一类型的URL,例如,/tracking/a、/tracking/b(如下所示),请为此路径[tracking*]创建一个新发行版,并仅为此发行版创建一个白名单用户代理。因此,除了此路径之外,您没有对所有URL进行AWS缓存 您两次提到CloudFlare,但问题似乎都与CloudFront有关。澄清?如果不针对源文件进行缓存,那么将头文件发送到源文件有什么意义?如果我从另一个浏览器访问站点,源站根本看不到任何内容,因为缓存的内容会返回。。。但是如果这是可以接受的,那么源站就不需要知道我的用户代理,因为它不使用这些信息来修改响应,也不用于日志记录或统计目的,因为源站只看到一小部分请求。所以你到底想解决什么问题?知道这些信息应该会让我们找到一个合适的解决方案。我是说“CloudFront”对不起,编辑了我的问题。是的,me web应用程序具有可缓存的资产、图像、JS、CSS,以及向用户返回个性化数据的不可缓存的GET操作。使用类似CDN的服务仍然有巨大的好处。在Kibana中存储日志时,出于统计原因,我正在使用
用户代理
。在我的例子中,我想知道用户代理
,因为它是不影响内容的附加信息。CloudFront使其无法实现。也许我的方法并不理想,但这就是这个应用程序的发展过程,我正在寻找实现这一点的工具。作为保存值的realUserAgent
的替代方法是使用字符串化的布尔值,即'true'
或'false'
。然后将标题从x-my-user-agent
更改为isbot
。这样,如果CloudFront在其缓存白名单中包含自定义头,则您只能基于'true'
或'false'
值进行缓存,并且仍然可以获得性能缓存。此外,如果尝试从这些边缘登录