在CloudFront Lambda@Edge源请求中获取用户域名(SEO优化)
解决CloudFront Lambda@Edge源请求中获取原始用户域名的问题
以下是几个可靠的解决方法,无需复杂配置即可拿到用户访问的原始域名:
方法1:直接读取Lambda事件中的Viewer域名信息
CloudFront在触发Lambda@Edge源请求事件时,会自动携带用户请求的原始域名信息,无需依赖标头转发。直接从事件对象的request.viewer.domainName字段读取即可,这是最便捷的方式。
代码示例:
exports.handler = (event, context, callback) => { const cfRequest = event.Records[0].cf.request; // 获取用户访问的原始域名 const originalUserDomain = cfRequest.viewer.domainName; // 在这里执行你的SEO调整逻辑,比如修改请求路径、添加自定义响应头等 // 示例:给请求添加自定义标头,后续可用于S3或其他处理 cfRequest.headers['x-seo-original-domain'] = [{ key: 'X-SEO-Original-Domain', value: originalUserDomain }]; callback(null, cfRequest); };
方法2:通过自定义源请求策略转发原始Host标头
如果需要将原始域名通过HTTP标头传递给源(比如S3),可以配置CloudFront转发自定义标头:
- 进入CloudFront控制台,找到目标分发的行为设置,点击编辑
- 在「源请求策略」处选择「创建自定义源请求策略」
- 在自定义策略中,添加自定义标头:名称设为
X-Original-Host,值选择「Origin Host Header」(即用户请求的原始Host) - 保存策略并关联到当前行为,等待CloudFront部署完成
- 在Lambda@Edge函数中,通过
cfRequest.headers['x-original-host'][0].value读取原始域名
注意:如果源是S3静态网站托管,直接转发
Host标头可能导致S3返回403错误(因为S3静态网站绑定了特定域名),因此建议用自定义标头而非直接转发Host。
关键注意事项
- Lambda@Edge函数必须部署到us-east-1区域,且需配置正确的IAM权限,允许CloudFront调用该函数
- 修改CloudFront配置后,需等待10-15分钟让分发部署生效,再进行测试
- 测试时可通过CloudFront的实时日志功能,验证原始域名是否被正确获取
内容的提问来源于stack exchange,提问作者Sayed Murad
相关产品推荐
相关产品推荐

