AWS API Gateway自定义域名替换Host Header致Nginx路由异常求助
解决API Gateway替换Host Header导致Nginx路由失效的问题
问题背景
当前架构为:Route 53 → 配置了自定义域名的AWS API Gateway → 运行在EC2上的Nginx,Nginx配置了3个server块实现基于Host Header的路由:
subdomain1.mydomain指向/sub1目录subdomain2.mydomain指向/sub2目录mydomain指向根目录/
但AWS API Gateway默认会将接收到的原始Host Header替换为集成端点的DNS,导致Nginx无法识别该值,进而无法正确路由请求。
解决方案
方案1:在API Gateway集成请求中转发原始Host Header
直接在API Gateway的集成配置中强制转发原始自定义域名作为Host Header:
- 登录AWS控制台,进入目标API的API Gateway管理页面
- 选择对应的资源和方法,进入Integration Request配置页
- 向下滚动到HTTP Headers区域,点击Add header
- 填写Header名称为
Host,映射值设置为$context.domainName(该变量会获取API Gateway自定义域名的原始值) - 保存配置后,重新部署API到对应阶段
方案2:修改Nginx配置,优先读取X-Forwarded-Host
API Gateway会自动将原始Host Header存入X-Forwarded-Host请求头,可让Nginx优先使用这个值进行路由:
在Nginx的http块中添加map指令,统一处理Host值:
http { map $http_x_forwarded_host $actual_host { default $host; ~.+ $http_x_forwarded_host; } server { listen 80; server_name subdomain1.mydomain; root /sub1; access_log /var/log/nginx/sub1.access.log main; } server { listen 80; server_name subdomain2.mydomain; root /sub2; access_log /var/log/nginx/sub2.access.log main; } server { listen 80; server_name mydomain; root /; access_log /var/log/nginx/root.access.log main; } }
修改后重启Nginx服务:sudo systemctl restart nginx
验证方法
使用curl测试请求,检查Nginx日志中的Host值是否正确:
curl -H "Host: subdomain1.mydomain" https://your-api-gateway-custom-domain
查看Nginx的access.log,确认host字段显示为subdomain1.mydomain而非API Gateway集成端点的DNS。
内容的提问来源于stack exchange,提问作者Ronaldo Lanhellas
相关产品推荐
相关产品推荐

