目录
- 前言
- 1. 基本知识
- 2. Demo
前言
对于Nginx的讲解,更多推荐阅读:
- Nginx配置静态网页访问(图文界面)
- Nginx将https重定向为http进行访问的配置(附Demo)
- Nginx从入门到精通(全)
- 详细分析Nginx配置参数(附Demo)
1. 基本知识
这个知识点大有学问!
在 Nginx 中,proxy_pass 用于反向代理的关键指令,它决定 Nginx 将客户端请求转发到哪个上游服务器
proxy_pass 的末尾斜杠会影响请求的 URL 重写方式,因此理解它的细微差别非常重要
带斜杠和不带斜杠的区别
-
不带斜杠的 proxy_pass:
Nginx 不会将客户端请求的 URI 的一部分与 proxy_pass 的 URI 进行拼接
location 配置中的 URI 部分直接被替换为 proxy_pass 指定的 URI -
带斜杠的 proxy_pass:
Nginx 会将 location 中的匹配部分替换为 proxy_pass 后的 URI 部分,并保留客户端请求的 URI 剩余部分
换句话说,Nginx 将请求的路径拼接到 proxy_pass 的 URL 后面
两种方式的区别(带 URI 和不带 URI)
Nginx 中 proxy_pass 有两种使用方式:
- 不带 URI 的方式:
proxy_pass 直接指向上游服务器的主机名或 IP 地址,不包括任何路径部分
此时 location 匹配的整个 URI 将直接传递给上游服务器
location /api {
proxy_pass http://backend;
}
在这个配置中,如果客户端请求 http://example.com/api/v1/users,Nginx 将向上游服务器发送请求为 http://backend/api/v1/users
- 带 URI 的方式:
proxy_pass 指定了一个完整的 URL,包括路径部分
如果 proxy_pass URL 后面有斜杠,location 匹配的 URI 部分会被去掉,并把剩下的 URI 追加到 proxy_pass 的 URL 之后
location /api {
proxy_pass http://backend/;
}
在这个配置中,如果客户端请求 http://example.com/api/v1/users,Nginx 会向上游服务器发送 http://backend/v1/users
/api 被去掉了,因为 proxy_pass 后面有斜杠
2. Demo
不带斜杠的配置:
location /app {
proxy_pass http://backend/app;
}
解释:
如果客户端发起请求 http://example.com/app/test,
Nginx 会将请求转发到 http://backend/app/test,/app 作为 proxy_pass 的一部分被保留
带斜杠的配置:
location /app {
proxy_pass http://backend/;
}
解释:
如果客户端发起请求 http://example.com/app/test,
Nginx 会将请求转发到 http://backend/test,/app 被移除,只保留 /test
总的来说:
- 带斜杠的 proxy_pass:会保留请求路径的动态部分
- 不带斜杠的 proxy_pass:将保留 proxy_pass 自己的路径,并直接替换 location 的匹配部分
实战中的Demo如下: