location 的斜杠问题比较好理解,不带斜杠的是模糊匹配。例如:
location /doc
- 可以匹配 /doc/index.html,也可以匹配 /docs/index.html。
location /doc/ 强烈建议使用这种
- 只能匹配 /doc/index.html,不能匹配 /docs/index.html。
对于 proxy_pass 的斜杠问题,得结合 location 来讲。
(1)proxy_pass 不带URL方式 保留(端口后面没有/)
proxy_pass后面这种 IP、端口后面没有 /,是不带 URI 的方式,nginx 会保留 location 中的路径。所以访问 http://127.0.0.1/docs/,实际上访问的是 http://127.0.0.1:8080/docs/。
location /docs/ {
proxy_pass http://127.0.0.1:8080;
}访问 http://127.0.0.1/docs/ ----------------------------> 实际访问 http://127.0.0.1:8080/docs/
location /jenkins/ {
proxy_set_header host $host;
proxy_pass http://192.168.11.128:8080;}
tomcat日志:
192.168.11.128 - - [04/Jun/2023:07:50:59 +0800] "GET /jenkins/index.html HTTP/1.0" 404 648
(2)proxy_pass 带URI 的方式 替换
这种 IP、端口后面有 /,是带 URI 的方式,nginx 将会使用别名的方式来对 URL 进行替换。所以,访问 http://127.0.0.1/docs/,实际上访问的是 http://127.0.0.1:8080/,/docs/ 替换成了 /。
location /docs/ {
proxy_pass http://127.0.0.1:8080/;
}访问 http://127.0.0.1/docs/ -------------> 实际访问 http://127.0.0.1:8080/
location /article/ {
proxy_set_header host $host;
proxy_pass http://192.168.11.128:8080/;
}
后端tomcat日志:
192.168.11.128 - - [04/Jun/2023:08:08:56 +0800] "GET /index.html HTTP/1.0" 404 648
对带 URI 的方式进行扩展:
location /article/ {
proxy_pass http://127.0.0.1:8080/docs/;
}
这种同样 IP、端口后面有 /,也是带 URI 的方式。所以,访问 http://127.0.0.1/article/,实际上访问的是 http://127.0.0.1:8080/docs/,/article/ 替换成了 /docs/。
举例如下:
location /article/ {
proxy_set_header host $host;
proxy_pass http://192.168.11.128:8080/docs/;
}
192.168.11.128 - - [04/Jun/2023:08:00:26 +0800] "GET /docs/index.html HTTP/1.0" 404 648
经常出错的也正是这种带 URI 方式的写法 !!!!!proxy_pass后面不接/
例如:
location /article/ {
proxy_pass http://127.0.0.1:8080/docs;
}
docs后面不加斜杠/,那么在访问是的时候会和index.html在一起,访问的是docsindex.html,
所以建议所有的uri末尾后面都接上/
当访问 http://127.0.0.1/article/index.html 的时候。
本意是想访问 http://127.0.0.1:8080/docs/index.html。但是,/article/ 替换成了 /docs,所以实际访问的是 http://127.0.0.1:8080/docsindex.html。