背景
当下前后端项目分离是一种大的趋势,那么前后端分离之后用什么来做它们之前的信息传递桥梁呢,使用最多的就是nginx的反向代理了。
问题描述
在进行nginx反向代理配置的时候,location和proxy_pass中的斜线会造成各种困扰,有时候多一个或少一个斜线,就会造成完全不同的结果。
环境准备
- 下载nginx安装包并安装
- 前端环境可以使用相关命令打一个静态包放到nginx安装之后的html文件夹下面
- 配置nginx的conf的配置
- 启动一个springboot的后端微服务
proxy_pass直接映射主机无其他路径
1:location结尾有斜杠proxy_pass无斜杠情况
server { listen 8001; server_name localhost; root D:/nginx-1.19.3/html/dist; location /nginx-test/ { proxy_pass http://localhost:8080; } }
proxy_pass结尾无斜杠,nginx会将请求路径全部代理过去
例如我的请求是 http://localhost:8001/nginx-test/test 请求路径为/nginx-test/test 代理后的路径为 /nginx-test/test 代理后的请求为 http://localhost:8080/nginx-test/test
2:location结尾有斜杠proxy_pass有斜杠情况
server { listen 8001; server_name localhost; root D:/nginx-1.19.3/html/dist; location /nginx-test/ { proxy_pass http://localhost:8080/; } }
proxy_pass结尾有斜杠,nginx会将请求路径匹配location的剔除后再代理过去
例如我的请求是 http://localhost:8001/nginx-test/test 请求路径为/nginx-test/test 代理后的路径为 test 代理后的请求为 http://localhost:8080/test
3:location结尾无斜杠proxy_pass无斜杠情况
server { listen 8001; server_name localhost; root D:/nginx-1.19.3/html/dist; location /nginx-test { proxy_pass http://localhost:8080; } }
proxy_pass结尾无斜杠,nginx会将请求路径全部代理过去
例如我的请求是 http://localhost:8001/nginx-test/test 请求路径为/nginx-test/test 代理后的路径为 /nginx-test/test 代理后的请求为 http://localhost:8080/nginx-test/test
4:location结尾无斜杠proxy_pass有斜杠情况
server { listen 8001; server_name localhost; root D:/nginx-1.19.3/html/dist; location /nginx-test { proxy_pass http://localhost:8080/; } }
proxy_pass结尾有斜杠,nginx会将请求路径匹配location的剔除后再代理过去
例如我的请求是 http://localhost:8001/nginx-test/test 请求路径为/nginx-test/test 代理后的路径为 /test 代理后的请求为 http://localhost:8080//test
proxy_pass直接映射主机有其他路径
5:location结尾有斜杠proxy_pass无斜杠情况
server { listen 8001; server_name localhost; root D:/nginx-1.19.3/html/dist; location /nginx-test/ { proxy_pass http://localhost:8080/test; } }
nginx会将请求路径匹配location的剔除后再代理过去
例如我的请求是 http://localhost:8001/nginx-test/api 请求路径为/nginx-test/api 代理后的路径为 api 代理后的请求为 http://localhost:8080/testapi
6:location结尾有斜杠proxy_pass有斜杠情况
server { listen 8001; server_name localhost; root D:/nginx-1.19.3/html/dist; location /nginx-test/ { proxy_pass http://localhost:8080/test/; } }
nginx会将请求路径匹配location的剔除后再代理过去
例如我的请求是 http://localhost:8001/nginx-test/api 请求路径为/nginx-test/api 代理后的路径为 api 代理后的请求为 http://localhost:8080/test/api
7:location结尾无斜杠proxy_pass无斜杠情况
server { listen 8001; server_name localhost; root D:/nginx-1.19.3/html/dist; location /nginx-test { proxy_pass http://localhost:8080/test; } }
nginx会将请求路径匹配location的剔除后再代理过去
例如我的请求是 http://localhost:8001/nginx-test/api 请求路径为/nginx-test/test 代理后的路径为 /api 代理后的请求为 http://localhost:8080/test/api
8:location结尾无斜杠proxy_pass有斜杠情况
server { listen 8001; server_name localhost; root D:/nginx-1.19.3/html/dist; location /nginx-test { proxy_pass http://localhost:8080/test/; } }
nginx会将请求路径匹配location的剔除后再代理过去
例如我的请求是 http://localhost:8001/nginx-test/api 请求路径为/nginx-test/test 代理后的路径为 /api 代理后的请求为 http://localhost:8080/test//api
总结
案例 |
location |
proxy_pass |
结果 |
1 |
/nginx-test/ |
/nginx-test/test |
|
2 |
/nginx-test/ |
/test |
|
3 |
/nginx-test |
/nginx-test/test |
|
4 |
/nginx-test |
//test |
案例 |
location |
proxy_pass |
结果 |
5 |
/nginx-test/ |
/testapi |
|
6 |
/nginx-test/ |
/test/api |
|
7 |
/nginx-test |
/test/api |
|
8 |
/nginx-test |
/test//api |