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

标签 http amazon-cloudfront user-agent

我希望我的来源能够看到 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 the Date and User-Agent headers, but we don't recommend it. These headers have a lot of possible values, and caching based on their values would cause CloudFront to forward significantly more requests to your origin.

引用: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/

相关文章:

java - 如何在 Android Activity 之间的 HttpContext 中保留 HTTP session cookie?

javascript - Node JS : Request Loop Until Status Code 200

amazon-web-services - 使用 Lambda、API Gateway 和 Cloudfront 时,尽管在 Lambda 响应中指定了 'Access-Control-Allow-Origin',但 CORS 错误

ruby-on-rails - Rails 如何将预编译 Assets 上传到 Cloudfront

javascript - 从 Google Chrome 扩展检测操作系统

html - 当点击托管在 web 上的目录的 url 时,如何创建默认模板?

security - Lift 是否会阻止 HTTP 响应拆分?

amazon-web-services - Lambda@Edge 事件处理程序的 AWS::Serverless::Function lambda 版本

api - 我应该使用自定义 header 还是用户代理 header 将设备信息发送到服务器

ios - iPad 与 iPad Mini 用户代理