首页 > 系统相关 >Nginx 中 proxy_pass 末尾斜杠的奥秘

Nginx 中 proxy_pass 末尾斜杠的奥秘

时间:2024-09-22 15:51:52浏览次数:10  
标签:http xxx URI Nginx location 斜杠 pass 8080 localhost

一、proxy_pass 的类型概述

Nginx 的官网将 proxy_pass 分为两种类型:不带 URI 方式和带 URI 方式。

不带 URI 方式只包含 IP 和端口号,例如 proxy_pass http://localhost:8080。而带 URI 方式在端口号之后有其他路径,包括只有单个 “/” 的,如 proxy_pass http://localhost:8080/,以及其他路径,比如 proxy_pass http://localhost:8080/xxx。

这两种类型的处理方式有很大不同,理解它们的区别对于正确配置 Nginx 反向代理至关重要。

1、 在不带 URI 方式下,nginx 将会保留 location 中路径部分,当访问 http://localhost/api1/xxx 时,若配置为

location /api1/ {
    proxy_pass http://localhost:8080;
}

会代理到 http://localhost:8080/api1/xxx


2、 在带 URI 方式下,nginx 将使用诸如 alias 的替换方式对 URL 进行替换,例如当访问 http://localhost/api2/xxx 时,若配置为

location /api2/ {
    proxy_pass http://localhost:8080/;
}

http://localhost/api2/(注意最后的 “/”)被替换成了 http://localhost:8080/,然后再加上剩下的 “xxx”,于是变成了 http://localhost:8080/xxx。了解这两种类型的特点,能帮助我们在实际应用中更加准确地配置 Nginx,确保反向代理的正确运行。

二、不带 URI 方式详解

(一)举例与原理

为了更好地理解不带 URI 方式的工作原理,我们来看更多的例子。假如客户端请求为:http://localhost/test3/xxx,配置为

location /test3/ {
    proxy_pass http://localhost:8080;
}

按照不带 URI 方式的规则,首先保留 location 后的所有内容,即 http://localhost/test3/xxx。然后拼接代理路径后面,最终请求为 http://localhost:8080/test3/xxx。

再看一个例子,客户端请求为:http://localhost/test4/xxx,配置为

location /test4/ {
    proxy_pass http://localhost:8080;
}

同样,先保留 location 后的所有内容,得到 http://localhost/test4/xxx。接着拼接代理路径,最终请求变为 http://localhost:8080/test4/xxx。

通过这些例子可以看出,在不带 URI 方式下,无论 location 中的路径具体形式如何,Nginx 都会严格按照 “保留 location 后的内容,拼接代理路径后” 的规则进行处理。

(二)总结特点

不带 URI 方式确实较为简单直接。在实际应用中,我们无需过多考虑复杂的路径替换规则,只要记住无论 location 中带不带右斜杠,都将其后面的内容直接拼接到代理路径后即可。这种方式在一些场景下可以快速实现反向代理的配置,提高配置效率。同时,由于其规则简单,也减少了出现配置错误的可能性。例如,在一些小型项目或者对反向代理要求不高的场景中,不带 URI 方式可以满足基本的代理需求,并且易于理解和维护。总之,不带 URI 方式以其简洁性和稳定性在 Nginx 的反向代理配置中有着特定的应用场景和价值。

三、带 URI 方式剖析

(一)举例与规则

假如客户端请求为:http://localhost/test7/xxx,配置为

location /test7/ {
    proxy_pass http://localhost:8080/aaa/bbb/;
}

按照带 URI 方式的规则,首先在客户端请求去除 location,获得剩下的右侧内容,即 xxx(获得的右侧内容)。然后拼接到代理路径中,最终请求为 http://localhost:8080/aaa/bbb/xxx。

再如,客户端请求为:http://localhost/test8/xxx,配置为

location /test8 {
    proxy_pass http://localhost:8080/ccc;
}

同样先去除 location,获得右侧内容 /xxx(获得的右侧内容)。接着拼接到代理路径中,最终请求为 http://localhost:8080/ccc/xxx。

通过这些例子可以清晰地看到,在带 URI 方式下,无论代理路径的具体形式如何,总是先去除 location,然后将剩余的右侧内容拼接到代理路径中。这种方式相对不带 URI 方式更加复杂,需要仔细考虑代理路径的具体配置,以确保最终的请求路径正确。

(二)总结建议

如前文所述,当 location 和 proxy_pass 中有一个不带斜杠时,最终的请求路径就可能出现不同寻常的情况。例如,客户端请求为 http://localhost/test9/xxx 时

location /test9 {
    proxy_pass  http://localhost:8080/ddd/;
 }

最终请求为 http://localhost:8080/ddd//xxx  这里会出现路径拼接错误的情况。

因此,为了避免出现这种错误,建议在配置 Nginx 反向代理时,要不 location 和 proxy_pass 都带斜杠,要不都不带。这样可以确保路径拼接的正确性,减少配置错误的可能性。在实际应用中,我们应该根据具体的需求和场景,谨慎选择带 URI 方式或不带 URI 方式,并严格遵循这个建议,以确保 Nginx 反向代理的稳定运行。

标签:http,xxx,URI,Nginx,location,斜杠,pass,8080,localhost
From: https://blog.51cto.com/u_9849794/12080741

相关文章

  • 在 NGINX 上托管 Angular 应用程序的终极指南
    在nginx服务器上托管angular应用程序可以增强性能,提供更好的安全性,并为生产环境提供更轻松的配置。以下是在nginx上部署angular应用程序的分步指南。先决条件已安装nginx:确保您的服务器上安装了nginx。您可以使用以下命令将其安装在基于linux的系统上:狂欢sudoaptupd......
  • web架构-nginx负载均衡
    nginx的负载均衡Nginx是一个广泛使用的反向代理服务器,能够高效地实现负载均衡。负载均衡的核心作用是将来自客户端的请求分发到多个后端服务器上,从而平衡每台服务器的压力。通过Nginx,我们可以实现多种负载均衡算法,如轮询、IP哈希等。vi/etc/nginx/nginx.conf插入http的下一......
  • nginx: 按ip地址限流
    一,以固定的速度提供服务语法:例子limit_req_zone$binary_remote_addrzone=test:10mrate=2r/s;server{location/{limit_reqzone=test;}}语法:imit_req_zone用于设置限流和共享内存区域的参数,格式为:limit_req_zonekeyzonerate。key: 定义限流对......
  • 使用 Nginx 搭建 Webdav 服务
    使用Nginx搭建Webdav服务一、自签名根证书1.生成根证书密钥opensslgenrsa-out./root.key20482.生成根证书opensslreq-x509-new-key./root.key-out./root.pem-days365交互信息CountryName(2lettercode)[]:CNStateorProvinceName(fullname)......
  • Nginx配置详解
    #nginx进程数,建议设置为等于CPU总核心数。worker_processes1;#事件区块开始events{#单个进程最大连接数(最大连接数=连接数*进程数)#根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行。每个进程允许的最多连接数,理论上每台nginx服务器的最大连......
  • Nginx反向代理出现502 Bad Gateway问题的解决方案
    ......
  • 编译安装nginx
    Nginx官方定义了Mainline、Stable、Legacy三种版本Mainlineversion(主线版本)该版本包含最新的功能和bug修复,被视为开发版,即正在活跃开发中的版本。其版本号通常为单数,这个版本的更新较快,可能会引入新的功能和修复,但也可能存在尚未解决的bug。Stableversion(稳定版本)最新稳......
  • nginx代理grafana
    nginx代理grafana背景我自己nginx不怎么会,然后我的生产环境已经不允许我使用【/】这个根路径了。我只能为其加上一个路径来解析。网络拓扑示意图如图所示,我想在运维电脑上请求grafanaweb。但是这中间夹了几层,目前已知防火墙是放通了负载均衡的80端口到运维电脑上,nginx和负载......
  • nginx: 分析最慢的url(日志中增加请求时长)
    一,设置nginx的日志格式:1,编辑nginx.conf[root@blogconf]#vinginx.conf说明:比默认设置只是在末尾增加了$request_time一项log_formatmain'$remote_addr-$remote_user[$time_local]"$request"''$status$body_bytes_sent"......
  • WPF behavior InvokeCommandAction CommadParameter pass selectedItem of currentcon
    <ListBoxx:Name="lbx"SelectedIndex="0"ItemsSource="{BindingBooksCollection,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"VirtualizingPanel.IsContainerVirtualizable="True"......