如何配置CloudFront将Host头转发至Lambda Function URL源站
解决CloudFront转发Lambda Function URL时的真实Host头传递问题
问题根源
Lambda Function URL要求源请求的Host头必须严格匹配其自身的域名(如xxxxxxxx.lambda-url.eu-central-1.on.aws),直接使用托管的AllViewer源请求策略会将自定义域名的Host头转发给Lambda,触发Lambda的域名验证逻辑,导致返回Message: null错误。
解决方案
需要自定义源请求策略,同时实现两个核心目标:
- 确保CloudFront发送给Lambda的
Host头是Lambda Function URL的域名,满足Lambda的验证要求 - 通过自定义请求头(如
X-Forwarded-Host)将用户请求的真实自定义域名Host传递给Lambda后端
具体配置修改(CloudFormation示例)
- 添加自定义源请求策略资源
CustomOriginRequestPolicy: Type: AWS::CloudFront::OriginRequestPolicy Properties: OriginRequestPolicyConfig: Name: LambdaFunctionUrlOriginRequestPolicy Comment: "转发Viewer头(除Host),添加X-Forwarded-Host传递真实Host" HeadersConfig: HeaderBehavior: whitelist Headers: # 按需添加需要转发的Viewer头 - Accept - Accept-Language - Origin - Referer # 自定义头,用于传递真实Host - X-Forwarded-Host CookiesConfig: CookieBehavior: none QueryStringsConfig: QueryStringBehavior: all
- 修改CloudFront分发的默认缓存行为
更新DefaultCacheBehavior,关联自定义源请求策略,并显式设置发送给Lambda的Host头为其自身域名:
DefaultCacheBehavior: TargetOriginId: LambdaOrigin CachePolicyId: '4135ea2d-6df8-44a3-9df3-4b5a84be39ad' # 保留原无缓存策略 ViewerProtocolPolicy: redirect-to-https SmoothStreaming: 'false' Compress: 'true' # 关联自定义源请求策略 OriginRequestPolicyId: !Ref CustomOriginRequestPolicy # 强制设置Host头为Lambda Function URL的域名 OriginCustomHeaders: - HeaderName: Host HeaderValue: !Select [2, !Split ["/", !GetAtt ApiLambdaFunctionUrl.FunctionUrl]]
- Lambda后端适配
在Lambda代码中读取X-Forwarded-Host获取真实的自定义域名Host,示例(Python):
def lambda_handler(event, context): # 优先取自定义头中的真实Host, fallback到默认Host real_host = event['headers'].get('x-forwarded-host') or event['headers']['host'] # 后续业务逻辑使用real_host return { 'statusCode': 200, 'body': f"真实访问域名:{real_host}" }
关键说明
- 禁止直接转发Viewer的
Host头给Lambda,必须保留Lambda Function URL的Host以通过域名验证 - 自定义头传递真实Host是标准适配方案,后端需对应读取该字段
- 自定义源请求策略中的白名单头可根据业务需求调整,仅转发必要的请求头
内容的提问来源于stack exchange,提问作者Peterhack
相关产品推荐
相关产品推荐

