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

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

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

测试

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/;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值