我正在尝试在CloudFront上利用AWS的地理跟踪功能来通知我的UI用户位置,以便它知道不会在有问题的区域中加载某些文件。
AWS文档提到了以下内容,但未明确说明如何配置CloudFront以将CloudFront-Viewer-Country标头转发到源。我需要这个工作,以便对我的缓存对象的请求使用CloudFront-Viewer-Country值生成响应。
根据查看器的位置配置CloudFront以缓存对象
如果您希望CloudFront根据请求来自的国家/地区缓存对象的不同版本,请配置CloudFront以将CloudFront-Viewer-Country标头转发到您的源。 CloudFront会自动将请求来自的IP地址转换为双字母国家/地区代码。有关易于使用的国家/地区代码列表,可按代码和国家/地区名称进行排序,请参阅维基百科条目ISO 3166-1 alpha-2。
答案 0 :(得分:6)
CloudFront默认情况下无法执行此操作 - CloudFront-Viewer-Country旨在作为请求标头发送到源,而不是响应标头,发送到浏览器。
但是......使用Lambda @ Edge Origin Response触发器,可以实现您尝试执行的操作:将此标头及其值回显到响应中。您转发到原点的大多数原始请求标题也可以在原始响应处理期间访问。
“AWS文档提到了以下内容,但未明确说明如何配置CloudFront以将
CloudFront-Viewer-Country
标头转发到源。”
通过选择Whitelist
并在左侧框中选择CloudFront-Viewer-Country
并将其移至右侧框中,在Cache Based on Selected Request Headers下的缓存行为设置中完成此操作。
您需要将此标题列入白名单以转发到原点,以便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);
};
请注意,无论实际的标题字母大小写如何,Lambda @ Edge都要求标题对象中的外键始终为小写。
答案 1 :(得分:1)
我使用Cloudfront请求标头在Nginx配置中使用add_header实现了相同的解决方案。
add_header cloudfront-viewer-country $http_cloudfront_viewer_country;
我认为这将是一种更便宜,更快捷的解决方案。