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/;
}
  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Nginx是一个开源的高性能的Web服务器和反向代理服务器。在Nginx中,全局参数不带端口是指在Nginx配置文件中定义的全局配置指令,这些指令用于设置Nginx服务器的全局参数,而不需要指定端口。 Nginx全局参数的设置通常在nginx.conf配置文件中完成。这些参数可以影响Nginx服务器的整体行为和性能。 例如,以下是一个Nginx配置文件的示例,其中省略了端口号: ```nginx user nginx; worker_processes auto; error_log /var/log/nginx/error.log; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; access_log /var/log/nginx/access.log; sendfile on; keepalive_timeout 65; server { listen 80; server_name example.com; root /usr/share/nginx/html; index index.html; location / { try_files $uri $uri/ =404; } } } ``` 在上面的例子中,我们可以看到全局设置指令,如`user`用于指定Nginx的运行用户,`worker_processes`用于设置Nginx的工作进程数量,`error_log`用于指定错误日志文件路径,`events`块中的`worker_connections`用于设置每个工作进程的最大连接数。 这些全局参数的设置不需要指定端口号,因为它们是针对整个Nginx服务器而言的。如果需要为特定的虚拟主机或服务配置端口号,则可以在对应的`server`块中设置。 总而言之,Nginx的全局参数不带端口指的是在配置文件中设置的用于影响整体行为和性能的指令,不需要特定的端口号来定义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值