解决Nginx location中配置proxy_pass转发时斜线‘/‘导致404问题
作者:空山苦水禅人
nginx location配置proxy_pass转发时斜线‘/‘导致404
在Nginx location通用匹配规则中配置proxy_pass转发时
假设有如下location配置:
location /test { proxy_pass http://localhost:8080/test; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host:$server_port; proxy_set_header X-Forwarded-Proto "https"; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Real-IP $remote_addr; }
如果我请求 http://localhost/test/a.jsp,则会将url根据匹配规则“/test”截取,然后将“/test”后面的内容(此处为“/a.jsp”)拼接到proxy_pass的后面,然后转发,也就是最后实际请求地址为:proxy_pass http://localhost:8080/test/a.jsp。
所以,如果location的匹配规则最后不加斜线'/',则proxy_pass的最后也不要加斜线,或者都加上斜线,不然就不能正确访问实际地址,导致404 not found错误。
注:正则匹配不适用,关于location的匹配规则,可以参考其他资料。
nginx反向代理中proxy_pass后面带\和不带\的坑
1. proxy_pass中带\和不带\的问题
(1)在nginx中配置proxy_pass时,当在后面的url加上了/,相当于是绝对根路径,则nginx不会把location中匹配的路径部分代理走;
(2)如果没有/,则会把匹配的路径部分也给代理走。
2. 举例
下面四种情况分别用http://192.168.1.4/proxy/test.html 进行访问。
(1)
location /proxy/ { proxy_pass http://127.0.0.1:81/; }
由于port后面有/ ,则不会代理匹配的路径,所以最终会被代理到: http://127.0.0.1:81/test.html
(2)
location /proxy/ { proxy_pass http://127.0.0.1:81; }
由于port后面没有/ , 则会代理匹配的路径,所以最终会被代理到: http://127.0.0.1:81/proxy/test.html
(3)
location /proxy/ { proxy_pass http://127.0.0.1:81/ftlynx/; }
由于port后面有/ ,则不会代理匹配的路径,所以最终会被代理到: http://127.0.0.1:81/ftlynx/test.html
(4)
location /proxy/ { proxy_pass http://127.0.0.1:81/ftlynx; }
由于port后面有/ , 则不会代理匹配的路径,所以最终会被代理到: http://127.0.0.1:81/ftlynxtest.html
心得:
- 从结果可以看出,应该说分为两种情况才正确。
- 即http://127.0.0.1:81(上面的第二种)和 http://127.0.0.1:81/…(上面的第1,3,4种)
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。