我正在尝试在 AWS Cloudfront 上使用 lambda@edge 为多个网站实现“代理”。
我的设置大致是:
DNS:*.domain.com -> some_uuid.cloudfront.net(云端分发)
Cloudfront:some_uuid.cloudfront.net -> s3 存储桶源
s3 bucket: websites/(包含多个网站的文件夹)
lambda@edge 函数:定义为 origin-request
我的 lambda@edge 函数非常简单:
检查网站资源是否存在于s3 bucket中。
如果是,请将请求 uri 更改为资源 s3 url。
如果没有,向后端服务器发送请求以呈现资源,存储在 s3 上并返回。
我在获取网站的原始域时遇到问题。例如,如果我尝试访问“my_website.domain.com”——在我的 lambda 函数中,我没有来自请求的域信息。
我认为我可以实现另一个 lambda@edge 函数作为查看器请求以将域作为 header 传递,但如果可以的话,我宁愿避免这种情况。
还有其他解决办法吗?
谢谢
最佳答案
这里的主要问题是 Cloudfront 覆盖了对原始主机的请求中的主机 header 。 我能够通过结合使用 viewer-request L@E 和 origin-request L@E 来解决这个问题。
在查看器请求 L@E 中,将主机 header 复制到另一个 header 中,例如 x-forwarded-host。
// 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)
}
将您的云端配置为在行为中将 x-forwarded-host
主机 header 列入白名单。
这样,Cloudfront 在缓存时也会考虑 x-forwarded-host
,并将 header 传递给 origin-request lambda
。
现在在您的原始请求 lambda 中,您可以访问 x-forwarded-host
header
// 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);
}
关于javascript - 从 AWS lambda@edge 访问原始 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47817019/