Nginx反向代理核心是location匹配与proxy_pass转发组合:location按=、^~、无符号、~或~*规则匹配路径;proxy_pass末尾斜杠决定路径剪裁或拼接;需设Host、X-Real-IP等头信息,并用proxy_redirect修正重定向。

核心就两点:用 location 匹配请求路径,再用 proxy_pass 指定转发目标。配置是否生效、路径怎么拼接,全看这两者的组合方式。
location 路径匹配要分清类型
匹配规则直接影响请求能否进到代理块里:
-
=:严格全等,比如
location = /login只匹配/login这一个路径,不带斜杠也不行 -
^~:前缀最长匹配且立即终止,适合静态资源或确定前缀的 API,比如
location ^~ /api/会优先匹配所有以/api/开头的请求 - 无符号(如
location /admin/):前缀匹配,但还会继续检查正则,优先级低于^~和= -
~ 或 ~*:正则匹配,
~区分大小写,~*不区分,匹配成功即停,不再往下找
proxy_pass 的斜杠决定路径怎么处理
这是最容易出错的地方——末尾有没有 /,转发后的 URL 完全不同:
-
proxy_pass http://127.0.0.1:8080/;(带斜杠)→ 原路径中匹配部分被剪掉,只转发剩余部分
例如location /api/ { proxy_pass http://127.0.0.1:8080/; },访问/api/user实际发给后端的是/user -
proxy_pass http://127.0.0.1:8080;(不带斜杠)→ 原路径完整拼在目标地址后
同样location /api/ { proxy_pass http://127.0.0.1:8080; },访问/api/user会发给后端/api/user
必须加的关键头信息
光转发不够,后端需要知道真实客户端信息:
-
proxy_set_header Host $host;:把原始域名传过去,避免后端生成错误跳转链接 -
proxy_set_header X-Real-IP $remote_addr;:让后端拿到真实 IP,不是 Nginx 的内网地址 -
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;:支持多层代理时链式传递来源 IP -
proxy_http_version 1.1;和proxy_set_header Connection "upgrade";:WebSocket 场景必需
重定向响应要手动改 Location
后端返回 301/302 时,原始 Location 头可能指向自己地址,浏览器会绕过 Nginx 直连。必须用 proxy_redirect 修正:
- 相对路径重定向:
proxy_redirect / /api/;把/login→/api/login - 绝对路径重定向:
proxy_redirect http://backend.com/ https://yourdomain.com/api/;


















