我试图在AWS Cloudfront上使用lambda@edge实现多个网站的“代理”。
我的设置大致如下:
DNS:*.domain.com -> some_uuid.cloudfront.net (云锋分布)
云阵: some_uuid.cloudfront.net -> s3桶起源
s3桶:网站/(包含多个网站的文件夹)
lambda@edge函数:定义为原始-请求
我的lambda@edge函数非常简单:
我有困难获得的起源域的网站。例如,如果我尝试访问"my_website.domain.com“-在我的lambda函数中,我没有来自请求的域信息。
我认为我可以实现另一个lambda@edge函数作为查看器请求将域作为标题传递,但如果可以的话,我更愿意避免这种情况。
还有别的解决办法吗?
谢谢
发布于 2017-12-15 19:27:27
因此,用例的问题是,暴露于原点的主机标头的值--请求L@E函数是s3桶的域名,而不是原始主机标头CloudFront从查看器接收到的值,对吗?
为了查看查看器接收到的原始主机头CloudFront,需要将其白名单。但是,CloudFront目前不允许为s3源文件添加白名单标题。这是一个缺陷/限制,应该由CloudFront修复。不过,有一个解决办法。如果s3桶是可公开访问的(也就是说,您没有使用原产地访问标识),那么您可以使用一个网站端点(如myBucket.s3-网站-us 1.amazonaws.com)将您的S3原点配置为自定义源。然后,你将能够白名单主机标题,并看到您的网站的域名,应观众的要求。然后,您可以根据用例修改源请求。还不要忘记将主机标头更改回s3端点,以便S3能够接受请求。
发布于 2018-10-29 02:01:51
这里的主要问题是Cloudfront将请求中的主机头覆盖到原始主机。通过使用查看器-请求L@E和源请求L@E的组合,我能够解决这一问题。
在查看器请求L@E中,将主机头复制到另一个标题中,如x转发主机。
// viewer-request.js
exports.handler = (event, context, callback) => {
const request = event.Records[0].cf.request
request.headers['x-forwarded-host'] = [
{ key: 'X-Forwarded-Host', value: request.headers.host[0].value }
]
return callback(null, request)
}将cloudfront配置为行为中的白名单x-forwarded-host主机头。这样,Cloudfront在缓存时还会考虑到x-forwarded-host,并将标头传递给origin-request lambda。
因此,现在在您的原始请求lambda中,您可以访问x-forwarded-host头。
// origin-request.js
exports.handler = (event, context, callback) => {
const request = event.Records[0].cf.request;
const headers = request.headers;
const requestHost = headers['x-forwarded-host'][0].value;
console.log(requestHost);
callback(null, request);
}https://stackoverflow.com/questions/47817019
复制相似问题