Nginx反向代理404?彻底搞懂 proxy_pass带斜杠与不带斜杠的路径拼接规则
由于开始不熟,没搞懂转发配置的关系,花了不少时间补充知识,总结如下
1、请求去哪了
location /admin { ... }
这表示只要浏览器访问的网址路径是以 /admin开头的(比如 www.xxx.com/admin/login),就会进入这个大括号里的规则。
proxy_pass http://100.x.x.x:90x;
这是最关键的一句。意思是把上面匹配到的请求,转发到 IP 为 100.x.x.x、端口为 90x的后端服务器上。
2、什么时候会拼接路径?
proxy_pass 后面没有写 URI 路径(参照上面的截图)
proxy_pass http://100.x.x.x:90;
就是原路转发,比如前端进来的全路径是 /admin/user/list,Nginx 会原封不动发给后端的 http://100.x.x.x:90/admin/user/list。收到什么就是什么。
proxy_pass 后面写了具体 URI 路径
proxy_pass http://100.x.x.x:90/admin/; (后面的斜杠很重要)
路径会被替换,截断!比如用户访问 /admin/user,Nginx 发现你配置了 /new_path/,它会把匹配到的 /admin丢掉,然后把剩下的 /user拼接到后面,最终发给后端的是 http://100.x.x.x:90/new_path/user。
再对比一下
| proxy_pass http://ip:90/new_path; | http://ip:90/new_pathuser |
| proxy_pass http://ip:90/new_path/; | http://ip:90/new_path/user |
| proxy_pass http://ip:90 | http://ip:90/admin/user |
3、proxy_set_header是干嘛的?
Host $host:告诉后端,用户原本访问的是哪个域名。
X-Real-IP $remote_addr:告诉后端,用户的真实 IP 地址是多少(否则后端看到的 IP 会是 Nginx 服务器的 IP)。
X-Forwarded-For ...:这是一个链式记录,如果经过了多层代理,它会把所有经过的 IP 都记录下来,方便后端追踪来源。
