nginx反向代理中神奇的斜线
nginx反向代理中神奇的斜线
在进行nginx反向代理配置的时候,location和proxy_pass中的斜线会造成各种困扰,有时候多一个或少一个斜线,就会造成完全不同的结果,所以特地将location和proxy_pass后有无斜线的情况进行了排列组合,进行了一次完整的测试,找出原理,以提高姿势水平~
〇. 环境信息
两台nginx服务器
nginx A: 192.168.1.48
nginx B: 192.168.1.56
一. 测试方法
- 在nginx A中配置不同的规则,然后请求nginx A:http://192.168.1.48/foo/api
- 观察nginx B收到的请求,具体操作是查看日志中的$request字段
二. 测试过程及结果
案例1
nginx A配置:
location /foo/ {
proxy_pass http://192.168.1.56/;
}
nginx B收到的请求:/api
案例2
nginx A配置:
location /foo/ {
proxy_pass http://192.168.1.56/;
}
nginx B收到的请求://api
案例3
nginx A配置:
location /foo/ {
proxy_pass http://192.168.1.56/;
}
nginx B收到的请求:/foo/api
案例4
nginx A配置:
location /foo/ {
proxy_pass http://192.168.1.56/;
}
nginx B收到的请求:/foo/api
案例5
nginx A配置:
location /foo/ {
proxy_pass http://192.168.1.56/bar/;
}
nginx B收到的请求:/bar/api
案例6
nginx A配置:
location /foo {
proxy_pass http://192.168.1.56/bar/;
}
nginx B收到的请求:/bar//api
案例7
nginx A配置:
location /foo/ {
proxy_pass http://192.168.1.56/bar;
}
nginx B收到的请求:/barapi
案例8
nginx A配置:
location /foo {
proxy_pass http://192.168.1.56/bar;
}
nginx B收到的请求:/bar/api
看到这里是不是都晕了呢,其实是有规律的
现在把这些案例按表格排列起来,结果表示nginx B收到的请求
表一
案例 | location | proxy_pass | 结果 |
---|---|---|---|
1 | /foo/ | http://192.168.1.48/ | /api |
2 | /foo | http://192.168.1.48/ | //api |
3 | /foo/ | http://192.168.1.48 | /foo/api |
4 | /foo | http://192.168.1.48 | /foo/api |
表二
案例 | location | proxy_pass | 结果 |
---|---|---|---|
5 | /foo/ | http://192.168.1.48/bar/ | /bar/api |
6 | /foo | http://192.168.1.48/bar/ | /bar//api |
7 | /foo/ | http://192.168.1.48/bar | /barapi |
8 | /foo | http://192.168.1.48/bar | /bar/api |
三. 解析
原请求路径:本文中统一为 "/foo/api"
location: 上面表格中的location列
proxy_pass:上面表格中的proxy_pass列
新请求路径:nginx将原请求路径处理过后的字符串
重点对proxy_pass
进行分析,可以分为3种形式
然后按照ip:port后是否接了字符串归为2类,"/"也是字符串,因此1归为一类,2、3归为一类,下面对这两类情况进行说明
当 proxy_pass 的 ip:port 后未接字符串的时候,nginx 会将原请求路径原封不动地转交给下一站 nginx,如案例3和4
当 proxy_pass 的 ip:port 后接了字符串的时候,nginx 会将 location 从 原请求路径 中剔除,再将剩余的字符串拼接到 proxy_pass 后生成 新请求路径,然后将 新请求路径 转交给下一站nginx(上面一种情况实际上和这个是一样的,只不过剔除的字符串是空串~~)
举个最让人疑惑的例子:案例7。proxy_pass 的 ip:port 后接了字符串 "/bar",因此将 location:"/foo/" 从 原请求路径:"/foo/api" 中剔除,变为"api",再将"api"拼接到proxy_pass:http://192.168.1.48/bar 后生成了新请求url:"http://192.168.1.48/barapi",因此下一站的nginx收到的请求就是 "/barapi"。
案例6:proxy_pass 的 ip:port 后接了字符串 "/bar/",因此将 location:"/foo" 从 原请求路径 "/foo/api" 中剔除,变为 "/api",再将 "/api" 拼接到proxy_pass:http://192.168.1.48/bar/ 后生成了 新请求路径:"http://192.168.1.48/bar//api",因此下一站的nginx收到的请求就是 /bar//api。
其它的案例都可以以此类推,现在终于搞明白了,再也不用一头雾水。
nginx反向代理中神奇的斜线的更多相关文章
- Nginx反向代理中使用proxy_redirect重定向url
在使用Nginx做反向代理功能时,有时会出现重定向的url不是我们想要的url,这时候就可以使用proxy_redirect进行url重定向设置了.proxy_redirect功能比较强大,其作用是对 ...
- 002-nginx-在 nginx 反向代理中使用域名,配置动态域名解析
一.概述 代理(proxy),即中间人,它代替客户端发送请求给服务器,收到响应后再转给客户端.通常意义上的代理是从用户的角度讲的,用户通过某个代理可以访问多个网站,这个代理是靠近用户的,比如某些公司可 ...
- 前端通过Nginx反向代理解决跨域问题
在前面写的一篇文章SpringMVC 跨域,我们探讨了什么是跨域问题以及SpringMVC怎么解决跨域问题,解决方式主要有如下三种方式: JSONP CORS WebSocket 可是这几种方式都是基 ...
- 实战 | 一文带你读懂Nginx反向代理
一个执着于技术的公众号 前言 在前面的章节中,我们已经学习了nginx基础知识: 给小白的 Nginx 10分钟入门指南 Nginx编译安装及常用命令 完全卸载nginx的详细步骤 Nginx 配置文 ...
- nginx反向代理(proxy_pass)tomcat的过程中,session失效的问题解决
Nginx反向代理tomcat,很是方便,但是也有些细节的问题需要注意:今天遇到了这样一个问题,tomcat中路径“host/web1”,nginx中直接“host/”代理,这时候session就无法 ...
- Nginx(http协议代理 搭建虚拟主机 服务的反向代理 在反向代理中配置集群的负载均衡)
Nginx 简介 Nginx (engine x) 是一个高性能的 HTTP 和反向代理服务.Nginx 是由伊戈尔·赛索耶夫为俄罗斯访问量第二的 Rambler.ru 站点(俄文:Рамблер)开 ...
- Nginx反向代理+负载均衡简单实现(http方式)
1)nginx的反向代理:proxy_pass2)nginx的负载均衡:upstream 下面是nginx的反向代理和负载均衡的实例: 负载机:A机器:103.110.186.8/192.168.1. ...
- Nginx反向代理的简单实现
1)nginx的反向代理:proxy_pass2)nginx的负载均衡:upstream 下面是nginx的反向代理和负载均衡的实例: 负载机:A机器:103.110.186.8/192.168.1. ...
- 基于Nginx反向代理及负载均衡
基于Nginx反向代理及负载均衡 参考:http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass 只要没有被启用,默认就是 ...
随机推荐
- 如何将任意文件固定在 Win10 的开始屏幕中
虽然Wox和Launchy是我日常启动程序的主力方式,不过开始屏幕的图标方便归类,这是快速启动工具所不能提供的,因此我也会将最常用的程序在开始屏幕上分类固定. 最近需要将一个常用的批处理文件(*.ba ...
- leetcode先刷_Pascal's Triangle II
三角相对简答题.第一个问题是太简单.我不沾了,我一定会写.其实没什么的第二个问题,与这个问题计算路径有点像一个三角形,假定输入是n,然后从第一行计数到第一n行,保存在数据线上的时间到,由于只有相关的事 ...
- [科普]MinGW vs MinGW-W64及其它(比较有意思,来自mingw吧)
部分参照备忘录原文: bitbucket.org/FrankHB/yslib/src/50c3e6344a5a24b2382ce3398065f2197c2bd57e/doc/Workflow.Ann ...
- 芯片超Intel,盈利比肩Apple,三星成科技界"全民公敌"
原标题:芯片超英特尔,盈利比肩苹果:三星现在是科技界“全民公敌”了 当人们津津乐道于三星的手机业务或者是电视业务时,它已静悄悄的拿下了芯片行业的第一,并且凭借着在芯片上的巨大获利让它的老对手们眼红 ...
- 简单说说Delphi中线程的释放
线程的释放方式有两种:一种是线程在运行完成后自动释放,一种是手动释放. 无论是那种释放,都应该在线程停止后进行释放. 然而线程的停止也有两种情况:一种是不需要设置标志位,直接完成:一种是由于execu ...
- liunx 桥接 上网 ip配置 外部网络访问
一.设置VMware 在vmware的[编辑]-->[虚拟网络编辑器]设置:将VMnet0设置为“桥接”,并桥接到宿主机器的网卡(可以是有线或者无线网络). 二.设置虚拟机系统(以cento ...
- 腾讯QQ 8.9.3体验版发布 在线文档多端同步实时保存
感谢N软网的投递 腾讯体验中心迎来QQ8.9.3首个维护体验版发布,详细版本号为v8.9.3.21006,上一个体验版v8.9.2.20717发布于4月20日,时隔34天又迎来了更新.本次升级主要是在 ...
- 浏览器中实现3D全景浏览
如果你用过网页版的百度地图,你大概3D全景图浏览是一种怎样的酷炫体验:在一个点可以360度环顾周围的建筑.景色,当然也可以四周移动,就像身临其境. 科普 全景图共分为三种: ①球面全景图 利用一张全景 ...
- Portal for ArcGIS 资源承载数据类型
在Portal中数据主要分为两大类:Web内容与桌面内容.对于Web内容与桌面内容中的每个项目(item)又被具体分为maps,layers, styles, tools,applications,和 ...
- C#高性能大容量SOCKET并发(四):缓存设计
原文:C#高性能大容量SOCKET并发(四):缓存设计 在编写服务端大并发的应用程序,需要非常注意缓存设计,缓存的设计是一个折衷的结果,需要通过并发测试反复验证.有很多服务程序是在启动时申请足够的内存 ...