反向代理配置中,location是否以"/"结尾,以及proxy_pass后的url是否以"/"结尾的区别
一、proxy_pass代理的地址后没有路径信息
1、转发地址为http://192.168.201.42:7200 时(url没有"/"结尾)
-
location匹配字符串后没有"/"
前端发出请求的地址为:http://192.168.201.41/gateway/dms/list;
后端实际接收到的地址:http://192.168.201.42:7200/gateway/dms/list;
-
location匹配字符串后有"/"
前端发出请求的地址为:http://192.168.201.41/gateway/dms/list;
后端实际接收到的地址:http://192.168.201.42:7200/gateway/dms/list;
2、转发地址为http://192.168.201.42:7200/ 时(url有"/"结尾)
-
location匹配字符串后没有"/"
前端发出请求的地址为:http://192.168.201.41/gateway/dms/list;
后端实际接收到的地址:http://192.168.201.42:7200//dms/list;
-
location匹配字符串后有"/"
前端发出请求的地址为:http://192.168.201.41/gateway/dms/list;
后端实际接收到的地址:http://192.168.201.42:7200/dms/list;
二、proxy_pass代理的地址后有路径信息
1、转发地址为http://192.168.201.42:7200/workflow 时(url没有"/"结尾)
-
location匹配字符串后没有"/"
前端发出请求的地址为:http://192.168.201.41/gateway/dms/list;
后端实际接收到的地址:http://192.168.201.42:7200/workflow/dms/list;
-
location匹配字符串后有"/"
前端发出请求的地址为:http://192.168.201.41/gateway/dms/list;
后端实际接收到的地址:http://192.168.201.42:7200/workflowdms/list;
2、转发地址为http://192.168.201.42:7200/workflow/ 时(url有"/"结尾)
-
location匹配字符串后没有"/"
前端发出请求的地址为:http://192.168.201.41/gateway/dms/list;
后端实际接收到的地址:http://192.168.201.42:7200/workflow//dms/list;
-
location匹配字符串后有"/"
前端发出请求的地址为:http://192.168.201.41/gateway/dms/list;
后端实际接收到的地址:http://192.168.201.42:7200/workflow/dms/list;
三、总结
1、location配置带斜杠和不带斜杠的区别
- location带斜杠和不带斜杠只是做匹配使用,带斜杠只是比不带斜杠多匹配了斜杠,匹配到的url就会走这个location,注意与proxy_pass结合使用
2、当proxy_pass代理的地址后带斜杠和不带斜杠需要分情况
1) 当地址后没有路径信息时:
-
结尾不带斜杠: location匹配部分也属于请求部分,都会将整个请求都将加到proxy_pass请求的url部分,即后端接收到的请求为:http://192.168.201.42:7200/gateway/dms/list
-
结尾带斜杠: localtion匹配部分只是用于匹配,不属于请求部分,需要在客户端请求部分将location匹配部分减去,即后端接收到的请求是:http://192.168.201.42:7200/dms/list
2) 当地址后有路径信息时:
- 结尾带斜杠和不带斜杠是一样的, nginx在转发的时候,都要在客户端请求部分将location匹配部分减去,最终后端接收到的是不带location匹配的地址
四、使用场景
1、如果location匹配的字符串是前端标识,不属于后端接口路径的一部分,统一使用:
#proxy_pass地址没有路径信息
location /gateway/ {
proxy_pass http://192.168.201.42:7200/
}
#proxy_pass地址有路径信息
location /gateway/ {
proxy_pass http://192.168.201.42:7200/dms/
}
2、如果location匹配的字符串是后端接口的一部分,统一使用:
#proxy_pass地址没有路径信息
location /workfow {
proxy_pass http://192.168.201.42:7200
}
#proxy_pass地址有路径信息
location /workfow {
proxy_pass http://192.168.201.42:7200/workflow/dms
}