nginx设置反向代理时,以”/“结尾和没有”/“结尾的区别

245 阅读2分钟

反向代理配置中,location是否以"/"结尾,以及proxy_pass后的url是否以"/"结尾的区别

一、proxy_pass代理的地址后没有路径信息

1、转发地址为http://192.168.201.42:7200 时(url没有"/"结尾)

  • location匹配字符串后没有"/"

image.png

前端发出请求的地址为:http://192.168.201.41/gateway/dms/list;

后端实际接收到的地址:http://192.168.201.42:7200/gateway/dms/list;

  • location匹配字符串后有"/"

image.png

前端发出请求的地址为: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匹配字符串后没有"/"

image.png

前端发出请求的地址为:http://192.168.201.41/gateway/dms/list;

后端实际接收到的地址:http://192.168.201.42:7200//dms/list;

  • location匹配字符串后有"/"

image.png

前端发出请求的地址为: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匹配字符串后没有"/"

image.png

前端发出请求的地址为:http://192.168.201.41/gateway/dms/list;

后端实际接收到的地址:http://192.168.201.42:7200/workflow/dms/list;

  • location匹配字符串后有"/"

image.png

前端发出请求的地址为: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匹配字符串后没有"/"

image.png

前端发出请求的地址为:http://192.168.201.41/gateway/dms/list;

后端实际接收到的地址:http://192.168.201.42:7200/workflow//dms/list;

  • location匹配字符串后有"/"

image.png

前端发出请求的地址为: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
}