Nginx根据post参数转发请求 (OpenResty)

2023-05-16

最近有个需求,需要nginx根据POST参数将请求转发到不同的后端,调研后决定使用OpenResty(Nginx + Lua)作为代理服务器。

写个小Demo:

location /test {
  set $target_url '';
  rewrite_by_lua_block {
    if "POST" == ngx.req.get_method() then
    	ngx.req.read_body()
		local args = ngx.req.get_body_data()  -- 如果要获取参数推荐使用ngx.req.get_post_args
		if string.match(args, "name=\"Key\"") == nil then
			ngx.var.target_url = "http://127.0.0.1:8000"
		else
			ngx.var.target_url = "http://127.0.0.1:8080"
		end
  }
  proxy_pass $target_url;
}

试了下,请求被正确转发了。好像一切都很好,实际用的时候,接口返回了500,因为args的值为nil
看了文档:

This function returns nil if
1. the request body has not been read,
2. the request body has been read into disk temporary files,
3. or the request body has zero size.

第一条,请求体没有被读,不知道怎么判断。第二条,请求体被读进了一个临时文件,依旧不知道怎么判断。第三条,请求体是空的,基本可以否定。

后来查到:

由于内存的限制,ngx_http_read_client_request_body()接口读取的请求体会部分或者全部写入一个临时文件中,根据请求体的大小以及相关的指令配置,请求体可能完整放置在一块连续内存中,也可能分别放置在两块不同内存中,还可能全部存在一个临时文件中,最后还可能一部分在内存,剩余部分在临时文件中。
————————————————
版权声明:本文为CSDN博主「weixin_39634022」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_39634022/article/details/111848493

猜测请求体太大被写入了临时文件,lua部分代码改为:

local filename = ngx.req.get_body_file()
if type(filename) ~= "nil" then
    file = io.open(filename, "r")
	for line in file:lines() do
	    -- 读到的格式为
	    -- .... name="Key"
	    --
	    -- value
		if string.match(line, "name=\"Key\"") ~= nil then
		    file:read()  -- 找到key后,先读取空行,然后再去匹配value
			if string.match(string.lower(file:read()), "value") == nil then
				ngx.var.target_url = "http://127.0.0.1:8000"
			else
				ngx.var.target_url = "http://127.0.0.1:8080"
			end 
			break
		end
	end
	file:close()
end

请求成功。
然后将两种方式结合起来,如果其中一种找不到就去尝试另一种。

因为对Nginx和Lua都不熟悉,以上也只是一种比较笨重的实现方式。学习后再来优化。

参考:

  1. nginx-api-for-lua
  2. nginx 获取body参数_nginx请求体读取
  3. Lua 参考手册
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nginx根据post参数转发请求 (OpenResty) 的相关文章

  • windows快捷键大全

    1 快速切换程序 xff1a Alt 43 Tab xff1b 2 永久删除文件Shift 43 Delete xff1b 3 秒开文件管理 xff1a Windows 43 E xff1b 4 直接显示桌面 xff1a Windows 4
  • mysql limit 用法-分页

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 在我们使用查询语句的时候 xff0c 经常要返回前几条或者中间某几行数据 xff0c 这个时候怎么办呢 xff1f 不用担心 xff0c mysql已经为我们提供了这样一个
  • Knowledge Tracing -- 基于贝叶斯的学生知识点追踪(BKT)

    目前 xff0c 教育领域通过引入人工智能的技术 xff0c 使得在线的教学系统成为了智能教学系统 xff08 ITS xff09 xff0c ITS不同与以往的MOOC形式的课程 ITS能够个性化的为学生制定有效的 学习路径 xff0c
  • word显示计算机没有内存不足,Word提示内存或磁盘空间不足【解决方法】

    类型 xff1a 安卓软件 大小 xff1a 12 9MB 语言 xff1a 简体中文 Word提示内存或磁盘空间不足原因 近期很多用户打开Word系统会提示我们内存或磁盘空间不足 xff0c 其实这并非是我们电脑硬件或者系统的问题 xff
  • 中矿大 C 石头剪刀布【决策DP*待看/codeforces原题】

    时间限制 xff1a C C 43 43 1秒 xff0c 其他语言2秒 空间限制 xff1a C C 43 43 32768K xff0c 其他语言65536K 64bit IO Format lld 题目描述 齐齐和司机正在玩剪刀石头布
  • Python 面向对象(初级篇)

    51CTO同步发布地址 xff1a http 3060674 blog 51cto com 3050674 1689163 概述 面向过程 xff1a 根据业务逻辑从上到下写垒代码函数式 xff1a 将某功能代码封装到函数中 xff0c 日
  • 9个常用的开源工单系统

    工单系统 xff08 也称为问题跟踪系统 xff0c 故障工单系统 xff0c 支持工单或事件工单系统 xff09 是一个计算机软件包或基于Web的软件包 xff0c 用于管理和维护组织需要的问题列表 工单系统通常用于组织的创建 xff0c
  • 64位系统使用Access 数据库文件的彻底解决方法

    方案一 xff1a 大部分都建议将 NET程序编译的时候 xff0c 目标平台设定为 x86 方案二 xff1a 下载安装Microsoft Access Database Engine 2010 Redistributable xff08
  • python使用系统剪贴板进行复制粘贴

    一 使用pyperclip 首先使用pip进行安装 xff1a pip install pyperclip 使用起来也很简单 xff1a In span class token punctuation span span class tok
  • eclipse 粘贴字符串自动添加转义符

    eclipse gt Window gt Preferences gt Java gt Editor gt Typing gt 勾选 Escape text when pasting into a string literal
  • Python3基础入门自学教程

    版权地址 xff1a https www wistbean com pyth pick up Python 给大家说一下 xff0c 我要开始学习 Python 了 xff0c Python 最近很火嘛 xff08 小样 xff0c 别太膨
  • Python提取json数据

    import json jsonstring 61 39 34 user man 34 34 name 34 34 Peter 34 34 name 34 34 xiaoming 34 34 user woman 34 34 name 34
  • Error:Too many parameters found at '^' position.

    SW1 Eth Trunk1 dis th interface Eth Trunk1 mode lacp static max active linknumber 2 return SW1 Eth Trunk1 SW1 GigabitEth
  • 解决docker-compose 命令不存在、未找到命令错误

    1 安装扩展源 sudo yum y install epel release 2 安装python pip模块 sudo yum install python pip 3 查看docker compose版本 docker compose
  • 团队项目中应如何评价个人对团队的贡献?

    这是一个非常有用的问题 如果不仔细思考这个问题 xff0c 就会造成团队成员的不公平 积极性不高等问题 Shine团队的队员们 xff0c 可以在这篇随笔里畅所欲言 xff0c 我先来 xff1a 王安然 xff1a 对于一个项目来说 xf
  • Hash算法初见

    hash算法 hashmap 实现原理 Hash xff0c 一般翻译做 散列 xff0c 也有直接音译为 哈希 的 xff0c 就是把任意长度的输入 xff08 又叫做预映射 xff0c pre image xff09 xff0c 通过散
  • JS学习笔记

    1 空值 xff1a null xff0c undefined NaN Not a Number e g var bestAge 61 null null var currentCount undefined NaN 作比较时 xff0c
  • linux下C语言socket网络编程简例

    转自 http blog csdn net kikilizhm article details 7858405 这里给出在linux下的简单socket网络编程的实例 xff0c 使用tcp协议进行通信 xff0c 服务端进行监听 xff0
  • linux下ffmpeg的使用方法

    格式转换 将file avi 转换成output flv C代码 ffmpeg i file avi output flv i 表示输入文件 现在有个视频video avi xff0c 有个音频 audio mp3 xff0c 将其合并成o
  • linux ssh登录 Permission denied (publickey)

    可能的原因 xff1a Linux上ssh服务没有开密码登录 目前发现两种解决方案 xff1a 打开密码登录 执行sudo vim etc ssh sshd config 找到PasswordAuthentication一项 xff0c 将

随机推荐

  • c语言:输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。...

    输入一行字符 xff0c 分别统计出其中英文字母 空格 数字和其他字符的个数 解 xff1a 程序 xff1a include lt stdio h gt int main char c int letters 61 0 space 61
  • ubuntu上网慢解决方案-配置dns

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 在ubuntu下用firefox等浏览器上网 往往比在windows下上网要慢好多 但细心的人会发现 慢的时间是花在DNS查找上面了 那么我们可以在本机缓存DNS 也就是在
  • c51按键控制灯亮汇编语言,用一个按键控制LED灯亮/暗的汇编程序

    今天又搞了一个小汇编 xff0c 是用一个按键控制LED灯亮 暗的汇编程序 程序编好后 xff0c 开始编译 xff0c 发现又是通不过 xff0c 找了好几遍也没找到原因 xff0c 后来找枫雪大哥看了 xff0c 才找出原因 xff0c
  • 如何使用linux程序mdadm创建软件RAID1软阵列

    如何使用linux程序mdadm创建软件RAID1软阵列 磁盘冗余阵列 RAID 是将多个物理磁盘结合成一个逻辑磁盘的技术 xff0c 该技术可以提高磁盘容错性能 xff0c 提高磁盘的读写速度 根据数据存储的排列 如 xff1a 条带存储
  • 极乐净土----Android实现图片转ascii码字符图的一些尝试

    掘金第一篇 xff0c 先转一个自己以前的帖子吧 xff0c 懒得重新写了 www jianshu com p 357af674a 转载于 https juejin im post 5c36df2cf265da616624abc6
  • idea中使用FindBugs-IDEA插件

    下载 安装 重启idea即可 xff1b 项目右键或者文件右键即可看到 FindBugs 选项 选择某个选项直接检测即可 检测结果如下图 xff1a 这里的Correctness是重点关注对象 这里面的错误往往是比较严重的 像空指针之类的错
  • pip,virtualenv,conda和anaconda的个人理解

    1 pip pip是python下的包管理工具 xff0c 主要用于从pypi下载所需的python包 xff0c 但是pip不会自动处理包之间的依赖关系 xff1b 在使用pip安装包时 xff0c 可以修改安装源为https pypi
  • Windows Server 2016-Hyper-V网络虚拟化概述

    在 Windows Server 2016 和虚拟机管理器中 xff0c Microsoft 提供的端到端网络虚拟化解决方案 有构成了 Microsoft 的网络虚拟化解决方案的五个主要组件 xff1a Windows Azure Wind
  • mac环境下安装pysvn

    可以从下载页下载对应版本的pysvn xff1a https pysvn sourceforge io downloads html 之后双击打开安装即可 xff0c 不需要再用pip安装 需要注意的是 xff0c 如果安装时提示chdir
  • 关于PHP中Session文件过多的问题

    PHP的默认机制 xff1a 每一次php请求 xff0c 会有1 100的概率 xff08 默认值 xff09 触发 session回收 如果 session回收 发生 xff0c 那就会检查 tmp sess 的文件 xff0c 如果最
  • RDO 远程 桌面无法复制

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 这里是列表文本这里是列表文本首先我们要检查 登录机在进程管理器中是否有rdpclipe exe这个进程 如果有则杀掉 xff0c 如果没有 xff0c 则在任务管理器中菜单
  • 如何在 Excel 中自定义菜单和菜单栏

    Microsoft 提供的编程示例只用于说明目的 xff0c 不附带任何明示或默示的保证 这包括但不限于对适销性或特定用途适用性的默示保证 本文假定您熟悉所演示的编程语言和用于创建和调试过程的工具 Microsoft 的支持工程师可以帮助解
  • 轮环(Ouroboros)世界观介绍,摘自Guide Book

    基于现实的架空世界观 这个游戏的世界观是基于以现代人的眼光来看待自身长久以来的发展与盛衰交替的事实 xff0c 而在此基础上构想出的简化的因果逻辑 xff0c 以及其外在的表现形式 祭祀 游戏根据中国古代的以国家为单位的大规模殉 祭奴隶的事
  • css背景图等比例缩放,盒子随背景图等比例缩放

    很多时候我们给网站了一个大banner 但是随着屏幕的变化 xff0c 背景会变形 xff0c 我们知道background size可以实现背景图等比例缩放 xff0c 但是 xff0c 我们想让下面的盒子根据缩放后背景图的高度 xff0
  • 如何用PS快速的批量制作连续号码数字编号图解

    如何用PS快速的批量制作连续号码数字编号图解 大家好 xff0c 今天太原博飞设计培训小编就告诉大家如用 PS 快速的制作连续数字编号 xff0c 在工作中尤其是大型活动的有时候制作连续的号码牌 xff0c 少还好 xff0c 如果上百上千
  • 我们评测了5个主流跨端框架,这是它们的区别

    最近前端届多端框架频出 xff0c 相信很多有代码多端运行需求的开发者都会产生一些疑惑 xff1a 这些框架都有什么优缺点 xff1f 到底应该用哪个 xff1f 作为 Taro 开发团队一员 xff0c 笔者想在本文尽量站在一个客观公正的
  • 大牛直播SDK-Windows RTMP/RTSP/本地FLV播放器使用说明 ...

    大牛直播播放器SDK相对推送SDK来说 xff0c 接口没有那么多 xff0c 不过客户95 以上的常规需求均已覆盖 xff0c 目前支持RTMP和RTSP直播播放 xff0c 还有本地flv文件回放 xff1a 大牛直播SDK播放端提供C
  • 交换机的配置文件备份到TFTP和FTP服务器

    1 构建拓扑 2 配置地址 Switch gt Switch gt en Switch conf t Switch config hostname 666 修改交换机名字 666 config interface vlan 1 进入虚拟接口
  • 推荐几款常用的Socks5代理软件

    一 Sockscap 荐 SocksCap是目前对网络游戏兼容性最好的代理工具之一 SocksCap32 软件是由美国 NEC USA Inc 公司出品的代理服务器第三方支持软件 拥有功能强大的 SOCKS 调度 xff0c 使用它就可以让
  • Nginx根据post参数转发请求 (OpenResty)

    最近有个需求 xff0c 需要nginx根据POST参数将请求转发到不同的后端 xff0c 调研后决定使用OpenResty xff08 Nginx 43 Lua xff09 作为代理服务器 写个小Demo location span cl