当前位置: 首页 > news >正文

Nginx中proxy_pass的斜杠问题(最详细讲解)

目录

1、proxy_pass的类型

2、不带URI方式列举说明

2.1、不带URI方式(例1)

2.2、不带URI方式(例2)

3、带URI方式举例说明

3.1、带URI方式(例1)

3.2、带URI方式(例2)

3.3、带URI方式(例3)

3.7、带URI方式总结


1、proxy_pass的类型

Nginx的官网将proxy_pass分为两种类型:

  • 一种是只包含IP和端口号的(连端口之后的/也没有,这里要特别注意),比如proxy_pass http://localhost:8080,这种方式称为不带URI方式
  • 另一种是在端口号之后有其他路径的,包含了只有单个/的,如proxy_pass http://localhost:8080/,以及其他路径,比如proxy_pass http://localhost:8080/xxx。这种称为带URI方式

(先明白上面的两种类型,很重要!下面的就按照我的方式,就能看懂了,只要你认真看完这篇文章,保证你对于proxy_pass的斜杠问题很通透!)

2、不带URI方式列举说明

我基于上面的两种类型给大家举例,为了方便理解,这里解释一下,咱们只用看proxy_pass中ip+端口后面有没有/,就可以区分是不带URI还是带URI方式了。例如:http://localhost:8080,这样的就是典型的不带URI方式,例如:http://localhost:8080/、http://localhost:8080/aaa、http://localhost:8080/a/b/c,这些统称为带URI方式。

2.1、不带URI方式(例1)

假如客户端请求为:http://localhost/test1/xxx

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

来看第一个举例,proxy_pass中http://localhost:8080没有后面的/,也就是典型的不带URI方式,

要得到代理后的请求路径,记住一句话:不带URI,保留location后的内容,拼接代理路径后详细看下面的步骤拆解

(1)首先保留location后的所有内容

http://localhost/test1/xxx

(2)拼接代理路径后面

最终请求:http://localhost:8080/test1/xxx

2.2、不带URI方式(例2)

如果上面例1还没有明白,我们多来几个例子,保证你能够看懂这个变换过程,来看例2

假如客户端请求为:http://localhost/test2/xxx 

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

这次是location中没有了右/,还是那句话:不带URI,保留location后的内容,拼接代理路径后。

详细看下面的步骤拆解:

(1)首先保留location后的所有内容

http://localhost/test2/xxx

(2)拼接代理路径后面

最终请求:http://localhost:8080/test2/xxx

2.3、不带URI方式总结

可以看出,不带URI方式是最简单的一个,不管loction中带不带右/,都是保留直接拼接到proxy_pass的后面。

3、带URI方式举例说明

带URI方式比较难懂,不过,只要按照我给的方法,也是非常的轻松,来看下面的举例。

还是一句话:带URI,去除location,剩下右侧内容拼接到代理路径中

3.1、带URI方式(例1)

假如客户端请求:http://localhost/test1/xxx

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

详细看下面步骤拆解:

(1)首先在客户端请求去除location,获得剩下的右侧内容

http://localhost/test1/xxx         --------------------------->         xxx获得的右侧内容

(2)拼接到代理路径中

最终请求:http://localhost:8080/xxx

3.2、带URI方式(例2)

还是那句话:带URI,去除location,剩下右侧内容拼接到代理路径中

假如客户端请求:http://localhost/test2/xxx

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

详细看下面步骤拆解:

(1)首先在客户端请求去除location,获得剩下的右侧内容

http://localhost/test2/xxx         -------------------------------->     /xxx获得的右侧内容

(2)拼接到代理路径中

最终请求:http://localhost:8080//xxx           http://localhost:8080//xxx(这里就有两个/了)

3.3、带URI方式(例3)

还是那句话:带URI,去除location,剩下右侧内容拼接到代理路径中

假如客户端请求:http://localhost/test3/xxx

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

详细看下面步骤拆解:

(1)首先在客户端请求去除location,获得剩下的右侧内容

http://localhost/test3/xxx      ------------------------>       xxx获得的右侧内容

(2)拼接到代理路径中

最终请求:http://localhost:8080/aaaxxx   

http://localhost:8080/aaaxxx(这里aaa和xxx之间没有/,显然这是不对的)

3.4、带URI方式(例4)

还是那句话:带URI,去除location,剩下右侧内容拼接到代理路径中

假如客户端请求:http://localhost/test4/xxx

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

详细看下面步骤拆解:

(1)首先在客户端请求去除location,获得剩下的右侧内容

http://localhost/test4/xxx      ------------------------>       xxx获得的右侧内容

(2)拼接到代理路径中

最终请求:http://localhost:8080/aaa/xxx   

3.5、带URI方式(例5)

还是那句话:带URI,去除location,剩下右侧内容拼接到代理路径中

假如客户端请求:http://localhost/test5/xxx

 location /test5 {proxy_pass http://localhost:8080/aaa;}

详细看下面步骤拆解:

(1)首先在客户端请求去除location,获得剩下的右侧内容

http://localhost/test5/xxx      ------------------------>       /xxx获得的右侧内容

(2)拼接到代理路径中

最终请求:http://localhost:8080/aaa/xxx   

3.6、带URI方式(例6)

还是那句话:带URI,去除location,剩下右侧内容拼接到代理路径中

假如客户端请求:http://localhost/test6/xxx

 location /test6 {proxy_pass http://localhost:8080/aaa/;}

详细看下面步骤拆解:

(1)首先在客户端请求去除location,获得剩下的右侧内容

http://localhost/test6/xxx      ------------------------>       /xxx获得的右侧内容

(2)拼接到代理路径中

最终请求:http://localhost:8080/aaa//xxx

http://localhost:8080/aaa//xxx(这里aaa和xxx之间有两个/,显然这是不对的)

3.7、带URI方式总结

估计有细心的小伙伴会发现一个问题,就是当location和proxy_pass其中有一个不带/(例如例2、例3、例6),最终的请求路径就不同寻常了,所以这里给大家一个建议,以后写反向代理时,要不location和proxy_pass 都带/,要不都不带,否则就会出现上面例子里的错误。

好了,本篇文章就到这里啦,制作不易,还请小伙伴们点赞支持呀!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C++:auto关键字、内联函数、引用、带默认形参值的函数、函数重载
  • Motionface ai工具有哪些?
  • 三相整流电路交流侧谐波仿真分析及计算
  • C语言入门基础题:最大公约数(三个数间取最大公约数)
  • C语言学习
  • vite.config.ts中proxy的rewrite理解
  • 【网络】网络的发展历程及其相关概念
  • 使用Response.Write实现在页面的生命周期中前后台的交互
  • Ubuntu小键盘消失,并且安装好搜狗输入法后无法打出中文的问题
  • 带头双向循环链表(一)
  • 前端(四):前后端分离开发(YAPI的使用)
  • 计算机网络中点到点与端到端协议的区别
  • web小游戏开发:拼图(四)对调和移动拼图玩法的实现
  • 自定义 SwiftUI 中符号图像的外观
  • 同一个项目两个页签之间通信之 BroadcastChannel
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • hadoop集群管理系统搭建规划说明
  • Java比较器对数组,集合排序
  • PHP 小技巧
  • SpringBoot 实战 (三) | 配置文件详解
  • SQLServer之索引简介
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • WebSocket使用
  • 产品三维模型在线预览
  • 回顾2016
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 开发基于以太坊智能合约的DApp
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 再谈express与koa的对比
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • 阿里云服务器如何修改远程端口?
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • #1015 : KMP算法
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (145)光线追踪距离场柔和阴影
  • (4)Elastix图像配准:3D图像
  • (55)MOS管专题--->(10)MOS管的封装
  • (6) 深入探索Python-Pandas库的核心数据结构:DataFrame全面解析
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (PADS学习)第二章:原理图绘制 第一部分
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (层次遍历)104. 二叉树的最大深度
  • (剑指Offer)面试题34:丑数
  • (九)c52学习之旅-定时器
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (十五)使用Nexus创建Maven私服
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (已解决)什么是vue导航守卫
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (转)创业家杂志:UCWEB天使第一步
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)