You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 17:41:10