如何使CloudFront-Viewer-Country出现在响应标题中?

Ben*_*ada 7 amazon-web-services amazon-cloudfront

我试图利用CloudFront上的AWS地理跟踪功能通知我的UI用户位置,以便它知道不会在有问题的区域加载某些文件。

AWS文档提到了以下内容,但未给出有关如何准确配置CloudFront以便将CloudFront-Viewer-Country标头转发到原始位置的明确说明。我需要这样做,以便对缓存对象的请求产生带有CloudFront-Viewer-Country值的响应。

配置CloudFront以根据查看器的位置缓存对象

如果希望CloudFront根据请求来自的国家/地区缓存对象的不同版本,请配置CloudFront以将CloudFront-Viewer-Country标头转发到您的来源。CloudFront会自动将请求来自的IP地址转换为两个字母的国家/地区代码。有关易于使用的国家/地区代码列表(可按代码和国家/地区名称排序),请参阅Wikipedia条目ISO 3166-1 alpha-2。

nid*_*dal 10

我使用 Cloudfront 请求标头在我的 Nginx 配置中使用 add_header 实现了相同的解决方案。

add_header cloudfront-viewer-country $http_cloudfront_viewer_country;
Run Code Online (Sandbox Code Playgroud)

我认为这将是一个更便宜、更快的解决方案。

  • 当页面缓存在 Cloudfront 中时将不起作用,因为请求未进入服务器 (3认同)

Mic*_*bot 9

CloudFront默认情况下无法执行此操作-CloudFront-Viewer-Country用作发送到源的请求标头,而不是发送到浏览器的响应标头。

但是,使用Lambda @ Edge原点响应触发器,可以实现您似乎想做的事情:将该标头及其值回显到响应中。在原始响应处理期间,也可以访问转发到原始位置的大多数原始请求标头。

“ AWS文档提到了以下内容,但未给出有关如何准确配置CloudFront以便将CloudFront-Viewer-Country标头转发到原始位置的明确说明。”

通过在“ 基于选定的请求标头的缓存”下的“缓存行为”设置中,通过选择WhitelistCloudFront-Viewer-Country在左侧的框中选择并将其移动到右侧的框,可以完成此操作。

您将需要将此标头列入白名单以转发到原点,以便Lambda @ Edge可以使用它-即使您的原点不使用或不需要它-您仍需要转发它才能使此功能正常工作如预期的那样,因为原始请求触发器无法看到CloudFront无法转发的内容...,并且除非将白名单(包括CloudFront-*CloudFront可以注入的大多数标题)列入白名单,否则大多数标题都不会转发。

'use strict';

exports.handler = (event, context, callback) => {
   const request = event.Records[0].cf.request;
   const response = event.Records[0].cf.response;
   if(request.headers['cloudfront-viewer-country'])
   {
      response.headers['cloudfront-viewer-country'] = request.headers['cloudfront-viewer-country'];
   }
   return callback(null,response);
};
Run Code Online (Sandbox Code Playgroud)

请注意,Lambda @ Edge要求标头对象中的外键始终小写,而不管实际的标头字母大小写如何。