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'
        值进行缓存,并且仍然可以获得性能缓存。此外,如果尝试从这些边缘登录