nginx 之 proxy_pass 接口转发的规则

2023-11-02

今天上了一个多页应用,发现接口转发后是 401。 最后发现是接口转发出错了。地址里多拼了一个 路径。 以前我一直以为location 字段会替换掉 proxy_pass 里面配置的 url 地址。 今天了解了一下 发现还是有不少细节的。

// node js 文件,打印请求路径。方便查看后端真实接受到的请求地址
const http = require('http');
http.createServer((req, res) => {
  console.log(req.url);
  res.end(`您的 请求 地址是${req.url}`);
}).listen(3000);

proxy_pass 如何转发,首先看 proxy_pass 的url 配置。

proxy_pass 只是HOST

proxy_pass 只是HOST,不包含任何路径,比如
* http://host - √
* https://host - √
* http://host:port - √
* https://host:port - √
* http://host/ - x
* http://host:port/ - x
这种情况下,会把匹配到的所有路径直接穿透转发。比如以下的配置

 location /api/ {
    proxy_pass http://127.0.0.1:3000;
 }

访问 http://127.0.0.1:80/api/cc, 后端结果为 您的 请求 地址是/api/cc

proxy_pass 包含路径

这里的路径哪怕只是一个 / 也是存在的,如:

  • http://host - x
  • https//host/ - √
  • http://host:port- x
  • https://host:port/ - √
  • http://host/api - √
  • http://host/api/ - √

这种情况下,url 里面会去掉 location 匹配的字符串,拼接到 proxy_pass 再进行转发。

 location /api/ {
    proxy_pass http://127.0.0.1:3000/;
 }

访问 http://127.0.0.1:81/api/cc, 后端结果为 您的 请求 地址是/cc

重写代理链接 - url rewrite

使用 rewrite 指令并且生效后,proxy_pass url 链接中的路径会被忽略,如:

server {
            listen       83;
            location / {
                rewrite ^/api/(.*) /fixpath=$1 break;
                proxy_pass http://127.0.0.1:3000/node/;
            }
            location ^/api/ {
                rewrite ^/api/(.*) /fixpath=$1 break;
                proxy_pass http://127.0.0.1:3000/node/;
            }
        }

访问 http://127.0.0.1:83/bb/cc 得到 您的 请求 地址是/node/bb/cc(匹配上 / 了,没有匹配 rewrite)
访问 http://127.0.0.1:83/api/cc 得到 您的 请求 地址是/fixpath=cc (我们写的 proxy_pass http://127.0.0.1:3000/node/ 里面的 node路径丢失了 )

知道了这几点,碰到转发接口也有一点底气啦~

更多

在github上看到的这本小书 ⬇️
(参考资料)[https://xuexb.github.io/learn-nginx/example/proxy_pass.html#url-%E5%8F%AA%E6%98%AF-host]

我的 nginx 配置

events {
}
http {
    # proxy_pass url 只是 host
    # 这时候 location 匹配的完整路径将直接透传给 url ,如:
	 server {
            listen       80;
            
            location / {
                proxy_pass http://127.0.0.1:3000;
            }

            location /api/ {
                proxy_pass http://127.0.0.1:3000;
            }
           
            
        }
    # url 包含路径
    # 当 proxy_pass url 的 url 包含路径时,匹配时会根据 location 的匹配后的链接透传给 url ,注意匹配后就是这样:
	 server {
            listen       81;
            
            location / {
                proxy_pass http://127.0.0.1:3000/;
            }

            location /api/ {
                proxy_pass http://127.0.0.1:3000/;
            }
            location /bpi/ {
                proxy_pass http://127.0.0.1:3000/v1;
            }
            location /cpi {
                proxy_pass http://127.0.0.1:3000/v1;
            }
        }
        # 当 location 以正则形式匹配时,proxy_pass 就不能以 / 结束了,也就是不能包含路径了, 会提示配置错误,比如错误的:

	 server {
            listen       82;
            
            location / {
                proxy_pass http://127.0.0.1:3000/;
            }
        # nginx: [emerg] "proxy_pass" cannot have URI part in location given by regular expression, or inside named location, or inside "if" statement, or inside "limit_except" block in /test.conf:47
        #    location ~* ^/api/ {
        #         proxy_pass http://127.0.0.1:3000/;
        #     }

        # nginx: [emerg] "proxy_pass" cannot have URI part in location given by regular expression, or inside named location, or inside "if" statement, or inside "limit_except" block in /Users/tangdaoyuan/code/anheng/jz-bingjiang/test.conf:52
        #    location ~* ^/api/ {
        #         proxy_pass http://127.0.0.1:3000/b1;
        #     }
        }

    # 使用 rewrite 指令并且生效后,proxy_pass url 链接中的路径会被忽略,如:
	 server {
            listen       83;
            location / {
                proxy_pass http://127.0.0.1:3000/node/;
            }
            location ^/api/ {
                rewrite ^/api/(.*) /fixpath=$1 break;
                proxy_pass http://127.0.0.1:3000/node/;
            }
        }

}

测试流程 : node 运行 服务, 启动Nginx 转发 , 再用postman 发送请求。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

nginx 之 proxy_pass 接口转发的规则 的相关文章

随机推荐

  • Chrome浏览器 F12控制台中文改成英文

    当Chrome浏览器 F12控制台是中文 怎么设置成英文 第一步 点击控制台右上角的设置图标 第二步 语言 选项从浏览器界面语言设置成英文 第三步 重新加载DevTools 控制台变成英文了
  • 联合索引详解

    联合索引详解 前言 在数据库中 索引是一种重要的数据结构 用于提高查询效率 而联合索引是一种特殊的索引类型 它可以同时索引多个列 联合索引在实际应用中非常常见 但是很多人对它的理解还不够深入 本文将从联合索引的定义 使用场景 创建方式以及注
  • 使用外腔量子级联激光器水对溶液中乳酸的定量和使用红外光谱作为液相色谱检测器的LabVIEW 自动化系统平台应用

    LabVIEW 服务器 高级实验室全自动化系统平台由一个服务器应用程序和多个客户端应用程序组成 每个客户端控制连接的硬件 例如泵 阀门或光谱仪 服务器用于通过 TCP 发送脚本命令 远程控制连接的客户端 每个客户端也可以在本地模式下使用 直
  • 配置Maven仓库

    一 下载安装maven maven下载官网 https maven apache org download cgi 下载到本地后解压 二 配置环境变量 我的电脑 属性 高级系统设置 环境变量 系统变量 新建MAVEN HOME 变量值为自己
  • DELPHI中两个UDP控件的用法

    DELPHI中有两个UDP控件 TIdUDPServer和TIdUDPClient控件 可用于传输UDP数据 用法都很简单 主要是一些细微的特性 弄清楚了对正确使用这两种控件有很大的好处 下面分别介绍 一 TIdUDPServer 代表一个
  • Postman的使用教程以及常见报错

    postman是一个功能强大的可以发送Http请求和接口调试的一个工具 这里看到的是工具 而不是插件 如果你看到资料是 插件 的话 实际说明这个资料有点年头了 或者说作者是抄别人的 现在百度很多站点的各种教程都是同一个文章一大堆人发布 但是
  • 前台页面Ajax返回404,但访问了对应Controller中映射请求的方法

    一 错误展示 前端页面一直显示页面加载中 二 错误调试 1 谷歌浏览器右键 gt 检查 查看控制台打印日志 报404错误 2 于是检查后台看是否调用了对应方法 结果后台打印输出了对应方法 3 说明请求的URL是正确的 那么问题来了 为什么报
  • Redis缓存穿透、缓存雪崩和缓存击穿

    Redis缓存的使用 极大的提升了应用程序的性能和效率 特别是数据查询方面 但同时 它也带来了一些问题 其中 最要害的问题 就是数据的一致性问题 从严格意义上讲 这个问题无解 如果对数据的一致性要求很高 那么就不能使用缓存 另外的一些典型问
  • 在Altium Designer 2022中创建一个完整的PCB电子设计工程项目(超详细)

    Altium Designer 学习笔记第二篇 创建一个完整的PCB电子设计工程项目 一 概述 1 一个完整的PCB设计文件共包含五部分 原件库文件 原理库文件 包含网络表文件 PCB库文件 PCB文件 生产文件 如下图所示 2 打开一个工
  • 衣服面料相关基础

    总结自 BiliBili视频 原来衣服的面料还能这么选 几个方法教你买到优质的短袖 再也不怕买衣服踩坑了 面子里子 既不能皱巴巴 又不能不透气 混纺 涤纶 粘纤 氨纶 涤纶 不变性 挺阔感 氨纶 弹性 粘纤 吸水透气 40 50 怕热 真丝
  • 正态分布函数_标准正态分布函数数值表怎么查?

    最近在整理数据时 忽然想到数理统计的其中一种分布 相信作为质量人一定不陌生 我们常常提到数据的分布是否服从正态分布 这是对一组连续数据分布一种描述 还会涉及到如何检验正态分布 对于这个分布的来龙去脉和数学分解 小编今天在这篇小文中就不罗嗦了
  • 李开复:创新工场首个项目是手机操作系统

    近日李开复接受腾讯科技专访 李开复透露 创新工场首个项目其实并非最早曝光的豌豆荚手机精灵 而是业界颇受关注的Tapas手机操作系统 9月8日消息 随着前谷歌中国大中华区总裁李开复创立的创新工场一周年临近及创新工场投资项目逐渐曝光 李开复和创
  • 柔性作业车间调度

    柔性作业车间调度 1 问题描述 1 1 传统作业车间调度 传统作业车间带调度实例 工件 工序 可选择的加工机器 M1 M2 M3 M4 M5 J1 O11 5 O12 11 O13 8 J2 O21 6 O22 9 O23 7 有若干工件
  • spring boot AOP 统一日志处理

    目录 使用日志框架logback 一 在 resources 下创建文件 logback spring xml 二 创建日志封装类 三 创建统一日志处理切面 WebLogAspect java 四 这里有俩个工具类注意 五 不同环境日志输出
  • js中!、!!、.?、??、??=、的用法和含义

    前言 优化项目中的三目运算 与或 if else的使用率 减少很多冗余的代码 和 的区别用法 js中 的用法是比较灵活的 他除了做逻辑运算常常会用 做类型判断 还可以用 与上对象来求得一个布尔值 1 可将变量转换成boolean类型 nul
  • 互联网晚报

    今日看点 双11首日 天猫1小时超2600个品牌GMV超去年全天 京东4小时售1 9亿件商品 菜鸟推出物流领域首个 个人减碳账单 双11网友开始比拼 回收量 特斯拉中国推出自营融资租赁购车服务 可零首付购买特斯拉 小鹏汽车智驾安全体系升级
  • 低秩矩阵(矩阵填充)-图像修复、协同过滤

    转载自 https blog csdn net manduner article details 80564414 一 矩阵填补 Matrix Completion 矩阵填补的应用很广泛 论文 Matrix completion by de
  • Windows终端工具——Hyper使用及配置

    简介 同步发布在个人博客 https www zhyong cn posts 1aac 欢迎访问 一直以来 都想找一个可以替换windows自带的cmd工具 常见的有cmder Babun 甚至是git bash 详见知乎问答 Window
  • Keil-C51 与 Keil -ARM 共存的方法

    按照之前的安装情况来看 我们将C51和ARM安装在了不同的文件夹里 将C51安装装包内的C51和UV4复制到ARM的安装包中 复制过程中会出现如下情况 此时选择跳过这些文件 修改ARM文件中的TOOLS INI文件 将C51文件夹中TOOL
  • nginx 之 proxy_pass 接口转发的规则

    今天上了一个多页应用 发现接口转发后是 401 最后发现是接口转发出错了 地址里多拼了一个 路径 以前我一直以为location 字段会替换掉 proxy pass 里面配置的 url 地址 今天了解了一下 发现还是有不少细节的 node