如何检测调用AWS Lambda函数的自定义子域名?
获取AWS Lambda请求的子域名
在你用Serverless部署Lambda、搭配CloudFront和Route53自定义域名的场景下,要检测请求的子域名,分两步操作:
1. 确保CloudFront转发原始请求的Host头
默认CloudFront会用自身域名作为Host头转发给Lambda,所以得先配置CloudFront转发原始Host:
- 进入CloudFront控制台,找到你的分发
- 切换到「行为」标签,编辑对应的行为规则
- 在「缓存策略和Origin请求策略」区域,选择包含转发
Host头的预设策略,或者创建自定义Origin请求策略,把Host添加到转发头列表 - 保存配置,等待CloudFront完成分发更新
2. 在Lambda函数中提取子域名
根据Lambda的触发方式,从事件对象中获取Host头后,再提取子域名:
场景1:API Gateway代理集成的Lambda
如果是Serverless部署的API Gateway+Lambda架构,请求的Host头会存放在event.headers.host中:
exports.handler = async (event) => { // 获取完整Host(例如 subdomain.yourdomain.com) const host = event.headers.host; // 提取单层子域名 const subdomain = host.split('.')[0]; // 后续业务逻辑 return { statusCode: 200, body: JSON.stringify({ subdomain }) }; };
场景2:Lambda@Edge(CloudFront直接触发)
如果是CloudFront直接触发Lambda@Edge,Host头在request.headers.host里(CloudFront事件结构中,头信息是包含value字段的对象数组):
exports.handler = async (event) => { const request = event.Records[0].cf.request; // 取出Host头的具体值 const host = request.headers.host[0].value; // 提取子域名 const subdomain = host.split('.')[0]; // 后续处理逻辑,比如修改请求或返回响应 return request; };
处理多层子域名
如果存在多层子域名(例如 a.sub.yourdomain.com),可以按需调整提取逻辑:
// 提取主域名之前的所有子域名部分(示例中得到a.sub) const parts = host.split('.'); const subdomain = parts.slice(0, parts.length - 2).join('.');
内容的提问来源于stack exchange,提问作者mohamad b
相关产品推荐
相关产品推荐

