Nginx location 块不支持嵌套,所谓“嵌套路由”是误解;请求头丢失主因是未启用 underscores_in_headers on 且未用 proxy_set_header 显式透传自定义头。

Linux 下 Nginx 请求头转发丢失,通常和 location 配置无关——因为 Nginx 的 location 块根本不支持嵌套。所谓“嵌套规则”本身就是一个常见误解,Nginx 启动时会直接报错:"location" directive is not allowed here。所以第一步不是检查嵌套,而是确认你有没有误写嵌套结构。
先排除 location 语法错误
检查配置中是否存在类似这样的非法写法:
location /api/ {-
location /api/v2/ { ... }← 这行会报错,Nginx 不允许 }
正确做法是所有 location 平级书写,靠匹配优先级区分逻辑层级,例如:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
-
location /api/ { ... }(前缀匹配,较宽泛) -
location /api/v2/ { ... }(更长前缀,自动优先生效) -
location ~ ^/api/v2/.+/delete$ { ... }(锚定正则,精确控制)
重点查请求头丢失的真正原因
请求头(尤其是带下划线的,如 X_User_ID)丢失,90% 以上不是 location 写法问题,而是以下两个配置缺失:
-
未开启下划线支持:在
http或server块中加underscores_in_headers on;,否则含_的 Header 被直接丢弃 -
未显式转发自定义头:Nginx 默认不传递非标准头,需用
proxy_set_header显式声明,例如:proxy_set_header X-User-ID $http_x_user_id;
验证是否命中了正确的 location 块
请求头转发行为只在生效的 location 块内起作用。可用以下方式确认:
- 在对应
location中临时加一条日志:access_log /var/log/nginx/debug.log main;,并启用$http_x_your_header变量到 log_format 中 - 用
curl -H "X-Test: 123" http://your-domain/test测试,并查日志看该 header 是否被记录 - 若日志里没有
X-Test,说明要么 header 被过滤(underscores_in_headers未开),要么根本没进这个 location(路径或正则不匹配)
附:快速自查清单
运行 nginx -t 后,再逐项核对:
- 配置中无任何
location块嵌套(语法合法) -
http块有underscores_in_headers on; - 目标
location内有proxy_set_header显式转发所需头 -
proxy_pass后面结尾斜杠规范(避免 URI 重写导致 query string 丢失) - 用
curl -v对比 Nginx 入口和后端实际收到的 headers 是否一致

















