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

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:

  1. 登录AWS控制台,进入目标API的API Gateway管理页面
  2. 选择对应的资源和方法,进入Integration Request配置页
  3. 向下滚动到HTTP Headers区域,点击Add header
  4. 填写Header名称为Host,映射值设置为$context.domainName(该变量会获取API Gateway自定义域名的原始值)
  5. 保存配置后,重新部署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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 01:40:17