前言:网上查了很多文章,确实有很多帖子详细列出了四种情况,然后举例子说明它们的区别,我看了几个帖子后依旧很乱,而且没有说明理由,很难记住。我自己经过多次试验,终于弄明白了,其实很简单,只有两种情况。
先上结论,一句话概括为:proxy_pass
不带uri
直接照搬,带uri
则去掉location
后拼接到proxy_pass
上。(听不懂没关系,简短的描述是为了方便记忆,请往下看)
其中,/
, /api
, /api/
, /api/user
, /api/user/
都叫uri
,(注意:单个的斜杠/
也是uri
)。
一、不带uri
server {
listen 8000;
server_name localhost;
location /api/ {
proxy_pass http://localhost:8001;
}
}
把地址和端口一换,其他照搬。所以请求http://localhost:8000/api/user/login
等同于请求http://localhost:8001/api/user/login
。
二、带uri
server {
listen 8000;
server_name localhost;
location /api/ {
proxy_pass http://localhost:8001/;
# proxy_pass http://localhost:8001/user;
# proxy_pass http://localhost:8001/user/;
}
}
请求http://localhost:8000/api/user/login
,首先把请求中的uri
去掉location
,即/api/user/login
去掉/api/
后得到user/login
,然后:
- 把
user/login
拼接到http://localhost:8000/
后得http://localhost:8000/user/login
- 把
user/login
拼接到http://localhost:8000/user
后得http://localhost:8000/useruser/login
- 把
user/login
拼接到http://localhost:8000/user/
后得http://localhost:8000/user/user/login
这三种情况其实适用于同一条规则。