Nginx 带不带斜杆的区别最全分析


共计 1895 个字符,预计需要花费 5 分钟才能阅读完成。

前言

由于 nginx 带不带/老是会混乱,并且确实在使用中出现过问题,比如使用不当导致代理后的 url 带有//,或者说配置很久也不能达到自己想要代理的效果。于是想着还是好好研究一下,并在以后规范自己 nginx 的使用。

如果代理后的地址带有 //,spring security 中可能报错:The request was rejected because the URL contained a potentially malicious String "//"

测试

准备工作

为了测试以下内容,专门做了一个镜像,不然看不见 nginx 代理后的完整请求,如果有需要的话可以搭建一下。

docker run -d --name full-path -p 5000:5000 hausen1012/full-path

然后可以根据 快速搭建 nginx 的脚本 这篇文章进行搭建 nginx。

1. location不带,proxy_pass带:

location /api {
    proxy_pass http://127.0.0.1:5000/;
}
  • 当请为/api/时,Nginx 会 308 重定向到/api

  • 当请求匹配到/api时,Nginx会将请求转发给http://127.0.0.1:5000/

  • 如果请求是 /api/path1/path2,则会转发到 http://127.0.0.1:5000//path1/path2

需要注意的是,这里如果后面不带 /,可能会导致双斜杠问题。(一般来说不会出问题,除非不允许使用双斜杠)

2. location带,proxy_pass带:

location /api/ {
    proxy_pass http://127.0.0.1:5000/;
}
  • 当请求匹配到/api时,Nginx 会 301 重定向到/api/

  • 当请求匹配到/api时,Nginx会将请求转发给http://127.0.0.1:5000/

  • 如果请求是 /api/path1/path2,则会转发到 http://127.0.0.1:5000/path1/path2

由上面两点得知,当proxy_pass带斜杠时,location部分是要被切割的部分,切割的内容具体取决于location的内容是否带斜杠,所以这就有可能导致双斜杠的问题。

3. location不带,proxy_pass不带:

location /api {
    proxy_pass http://127.0.0.1:5000;
}
  • 当请求匹配到/api时,Nginx会将请求转发给http://127.0.0.1:5000/api

  • 如果请求是 /api/path1/path2,则会转发到 http://127.0.0.1:5000/api/path1/path2

4. location带,proxy_pass不带:

location /api/ {
    proxy_pass http://127.0.0.1:5000;
}
  • 当请求匹配到/api时,Nginx 会 301 重定向到/api/

  • 当请求匹配到/api/时,Nginx会将请求转发给http://127.0.0.1:5000/api/

  • 如果请求是 /api/path1/path2,则会转发到 http://127.0.0.1:5000/api/path1/path2

结论

先说结论,proxy_pass路径带不带斜杠影响是否进行拼接location匹配的路径,如果带斜杠则不拼接,不带则拼接。而location带不带斜杠影响不是很大,带斜杠一定没问题,不带斜杠可能导致双斜杠问题。

那么这样的话可以规范一下配置文件的配置方式。

1. 所有的请求都转发到一个后端

location / {
    proxy_pass http://127.0.0.1:5000/;
}

这个是怎么配置都不会出问题的。

2. 需要截掉location部分

location /gateway/ {
    proxy_pass http://127.0.0.1:5000/;
}

都以斜杠结尾,不会有双斜杠问题。如果location是截取部分,那么可以这样操作。

location /gateway/api/ {
    proxy_pass http://127.0.0.1:5000/api/;
}

3. 代理后地址需要包含location部分

location /nacos/ {
    proxy_pass http://127.0.0.1:5000/nacos/;
}

比如 nacos 这种本来就有基础路径,那么还是在 proxy_pass 后面加上路径并带上斜杠即可。如果是多级路径,那么可以这样操作。

location /nacos/v1/ {
    proxy_pass http://127.0.0.1:5000/nacos/v1/;
}

提醒:本文发布于241天前,文中所关联的信息可能已发生改变,请知悉!

Tips:清朝云网络工作室

阅读剩余
THE END