proxy_pass末尾斜杠决定路径是否被剥离:带/则剥离前缀,不带则透传完整路径;必须配合proxy_set_header Host、X-Real-IP、X-Forwarded-For和X-Forwarded-Proto三至四行头信息设置,且proxy_pass需带http://协议前缀、指向可达地址。

proxy_pass末尾斜杠决定路径是否被剥离
这几乎是所有新手踩的第一个坑:请求路径对不上,后端直接返回404。关键不在后端代码,而在proxy_pass结尾有没有那个/。
- 写成
proxy_pass http://127.0.0.1:3000/;→ 请求/api/users会转发为http://127.0.0.1:3000/users(/api/被剥离) - 写成
proxy_pass http://127.0.0.1:3000;→ 请求/api/users会转发为http://127.0.0.1:3000/api/users(完整透传) - 后端路由注册的是
/users,那就必须用带/的写法;如果后端暴露的是/api/users,那就不能加/
漏掉 proxy_set_header 就等于没配代理
proxy_pass 单独存在几乎必然出问题——后端收不到真实 Host 和客户端 IP,轻则日志全是 127.0.0.1,重则返回 400 或跳转到 http://localhost。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
-
proxy_set_header Host $host;:保留原始域名,否则 Express 的req.hostname或 Django 的request.get_host()会变成127.0.0.1 -
proxy_set_header X-Real-IP $remote_addr;:单层代理时够用,但若前面还有 CDN 或 LB,优先用下一行 -
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;:正确追加 IP,避免覆盖已有值 - 如果后端做 HTTPS 判断(比如重定向逻辑),必须加
proxy_set_header X-Forwarded-Proto $scheme;
502 Bad Gateway 别查 CORS,先看连通性
502 是 Nginx 连不上后端,和跨域完全无关。真正卡住的往往是运行时环境,不是配置语法。
- 用
curl -v http://127.0.0.1:3000/health直连后端,确认服务真在跑、端口真开着 - 看 Nginx 错误日志:
tail -f /var/log/nginx/error.log,典型报错是connect() failed (111: Connection refused) - 检查后端监听地址:不能只写
localhost,得是127.0.0.1或0.0.0.0(某些系统里localhost解析失败) - 确认
proxy_pass地址带协议:http://127.0.0.1:3000✅,127.0.0.1:3000❌(缺http://直接 502)
内网穿透场景下 proxy_pass 指向谁
如果你用 frp/nps 做内网穿透,Nginx 的 proxy_pass 绝对不能指向内网机器地址——它只能指向本地 frps 监听的端口。
- 错误写法:
proxy_pass http://192.168.1.100:8080/;(Nginx 在云服务器上,根本访问不到这个地址) - 正确写法:
proxy_pass http://127.0.0.1:8080/;(frps 已在云服务器本地监听 8080) - 务必加
proxy_redirect off;,否则后端返回的Location: http://192.168.1.100:8080/login会被 Nginx 直接透传出去 - 后端生成绝对 URL 时,要适配反向代理(比如读取
X-Forwarded-Proto和Host头拼接),否则页面里依然暴露内网地址
proxy_pass 和三行 proxy_set_header 是刚性组合,少一个就可能让后端行为异常。最容易被忽略的是后端监听地址和 proxy_pass 协议前缀——它们不报语法错,但会让整个代理静默失效。

















