前言:网上查了很多文章,确实有很多帖子详细列出了四种情况,然后举例子说明它们的区别,我看了几个帖子后依旧很乱,而且没有说明理由,很难记住。我自己经过多次试验,终于弄明白了,其实很简单,只有两种情况。
先上结论,一句话概括为: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
这三种情况其实适用于同一条规则。