nginx反向代理中神奇的斜线

在进行nginx反向代理配置的时候,location和proxy_pass中的斜线会造成各种困扰,有时候多一个或少一个斜线,就会造成完全不同的结果,所以特地将location和proxy_pass后有无斜线的情况进行了排列组合,进行了一次完整的测试,找出原理,以提高姿势水平~

〇. 环境信息

两台nginx服务器

nginx A: 192.168.1.48

nginx B: 192.168.1.56

一. 测试方法

  1. 在nginx A中配置不同的规则,然后请求nginx A:http://192.168.1.48/foo/api
  2. 观察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种形式

  1. http://ip:port
  2. http://ip:port/
  3. http://ip:port/xxx

然后按照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反向代理中神奇的斜线的更多相关文章

  1. Nginx反向代理中使用proxy_redirect重定向url

    在使用Nginx做反向代理功能时,有时会出现重定向的url不是我们想要的url,这时候就可以使用proxy_redirect进行url重定向设置了.proxy_redirect功能比较强大,其作用是对 ...

  2. 002-nginx-在 nginx 反向代理中使用域名,配置动态域名解析

    一.概述 代理(proxy),即中间人,它代替客户端发送请求给服务器,收到响应后再转给客户端.通常意义上的代理是从用户的角度讲的,用户通过某个代理可以访问多个网站,这个代理是靠近用户的,比如某些公司可 ...

  3. 前端通过Nginx反向代理解决跨域问题

    在前面写的一篇文章SpringMVC 跨域,我们探讨了什么是跨域问题以及SpringMVC怎么解决跨域问题,解决方式主要有如下三种方式: JSONP CORS WebSocket 可是这几种方式都是基 ...

  4. 实战 | 一文带你读懂Nginx反向代理

    一个执着于技术的公众号 前言 在前面的章节中,我们已经学习了nginx基础知识: 给小白的 Nginx 10分钟入门指南 Nginx编译安装及常用命令 完全卸载nginx的详细步骤 Nginx 配置文 ...

  5. nginx反向代理(proxy_pass)tomcat的过程中,session失效的问题解决

    Nginx反向代理tomcat,很是方便,但是也有些细节的问题需要注意:今天遇到了这样一个问题,tomcat中路径“host/web1”,nginx中直接“host/”代理,这时候session就无法 ...

  6. Nginx(http协议代理 搭建虚拟主机 服务的反向代理 在反向代理中配置集群的负载均衡)

    Nginx 简介 Nginx (engine x) 是一个高性能的 HTTP 和反向代理服务.Nginx 是由伊戈尔·赛索耶夫为俄罗斯访问量第二的 Rambler.ru 站点(俄文:Рамблер)开 ...

  7. Nginx反向代理+负载均衡简单实现(http方式)

    1)nginx的反向代理:proxy_pass2)nginx的负载均衡:upstream 下面是nginx的反向代理和负载均衡的实例: 负载机:A机器:103.110.186.8/192.168.1. ...

  8. Nginx反向代理的简单实现

    1)nginx的反向代理:proxy_pass2)nginx的负载均衡:upstream 下面是nginx的反向代理和负载均衡的实例: 负载机:A机器:103.110.186.8/192.168.1. ...

  9. 基于Nginx反向代理及负载均衡

    基于Nginx反向代理及负载均衡 参考:http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass 只要没有被启用,默认就是 ...

随机推荐

  1. WPF: WrapPanel 容器的数据绑定(动态生成控件、遍历)

    原文:WPF: WrapPanel 容器的数据绑定(动态生成控件.遍历) 问题:        有一些CheckBox需要作为选项添加到页面上,但是数目不定.而为了方便排版,我选择用WrapPanel ...

  2. SICP 1.6-1.8

    1.6由于scheme应用序求值的性质,该函数会陷入循环(一直计算 improve guess x) 1.7 值过小,0.001这个精度远远不够... 值过大,由于浮点数精度有限,(比如使用IEEE7 ...

  3. python 安装 win 下的exe结尾的文件操作

    1.首先下载相关的模块 2.把下载的相关模块放到python 安装目录下 3.cmd 切换到python的安装目录下 例如:{PIL-1.1.7.win32-py2.7.exe} 4.执行 pip i ...

  4. PHP XDebug Sublime Text 单步调试

    前置环境:已经安装好LNMP 1. 安装xdebug 可以通过pear包管理来安装 sudo apt-get install php-pear sudo pecl install xdebug 这里我 ...

  5. GIS基础软件及操作(二)

    原文 GIS基础软件及操作(二) 练习二.管理地理空间数据库 1.利用ArcCatalog 管理地理空间数据库 2.在ArcMap中编辑属性数据 第1步 启动 ArcCatalog 打开一个地理数据库 ...

  6. ArcGIS数据生产与精细化制图之中国年降水量分布图的制作

    原文:ArcGIS数据生产与精细化制图之中国年降水量分布图的制作 楼主按:在今年的Esri中国用户大会上,我听了几场关于ArcGIS用于制图方面的讲座,也在体验区与Esri中国的技术老师有一些交流.一 ...

  7. SignalR的简单使用(二)

    原文:SignalR的简单使用(二) 之前提到SignalR代理在网页,通过生成的Js来完成相关的功能.但我不禁想一个问题, 难到SignalR的服务端就能寄存在web端吗,通过访问网页能方式才能启动 ...

  8. Android零基础入门第63节:过时但仍值得学习的选项卡TabHost

    原文:Android零基础入门第63节:过时但仍值得学习的选项卡TabHost 由于前几天参加一个学习培训活动,几乎每天都要从早晨7点到晚上一两点,没有什么时间来分享,实在抱歉中间断更了几天.从今天开 ...

  9. wp8.1之拍照(获取焦点,使用后置摄像头)

    wp8.1 没有像wp8一样直接用启动器开启摄像头,他要开启摄像头要借助CaptureElement呈现来自捕获设备(如照相机或网络摄像机)的流.今天讲讲如何打开摄像头,获取焦点,以及拍照.废话不多说 ...

  10. Setting up multi nodes live migration in Openstack Juno with devstack

    Setting up multi nodes live migration in Openstack Juno with devstack Summary Live migration overvie ...