nginx 根据参数动态代理

news2024/11/20 16:29:36

一、问题描述

nginx反向代理配置一般都是配置静态地址,比如:

server {
        listen 80;
        location / {
            proxy_pass http://myapp1;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }

这个反向代理表示访问80端口跳转到  http://myapp1 地址。
现在有需求代理的目的地址由动态传参决定,不能配置成静态的,传的参数为URL,然后反向代理到URL地址。

在配置过程中,会解决跳转后跨域问题和代理后地址自动拼接问题。

二、解决方案

1、nginx配置两个要跳转的地址作测试

地址一(index81.html 放在nginx/html/index81.html):

server {
        listen       81;
        server_name  localhost;
		location / {
            root   html;
            index  index81.html index81.htm;
        }
    }

地址二(index82.html 放在nginx/html/index82.html):

server {
        listen       82;
        server_name  localhost;
		location / {
            root   html;
            index  index82.html index82.htm;
        }
    }

2、动态代理配置

server {
	
        listen       80;
        server_name  localhost;
		rewrite ^/old-url$ /new-url permanent;
		location /_proxy/ {
			# 通过正则截取路由中的 sub url
			if ($request_uri ~* "/_proxy/(.*)") {
				set $proxy_url $1;
			}
			# 解析请求地址,并进行反向代理
			set $is_matched 0;
			if ($proxy_url ~* "^(http|ws)(s?):\/\/?([a-zA-Z0-9\-\.]+:?\d*)([^\?]*)") {
				set $is_matched 1;
				set $proxy_protocol http$2;
				set $proxy_host $3;
				set $proxy_uri $4;
				set $proxy_url $proxy_protocol://$proxy_host;
				rewrite ^ / break;
				proxy_pass $proxy_url;
			}

		}
    }

 如代码所示,/_proxy 为代理匹配字符串,rewrite 作用有两点:

        1、防止代理后的址带着 /_proxy 后边的路径。

        2、浏览器的地址栏里地址不会变,还是127.0.0.1:80/....,这样就解决了跨域问题

最后,粘贴全部代码,包括注释等等

server {
	
        listen       80;
        server_name  localhost;
		rewrite ^/old-url$ /new-url permanent;
        #charset koi8-r;

        #access_log  logs/host.access.log  main;
		
		location /_proxy/ {
			# 被代理路径为域名需要指定dns
			# resolver 114.114.114.114 valid=3600s;

			# 通过正则截取路由中的 sub url
			if ($request_uri ~* "/_proxy/(.*)") {
				set $proxy_url $1;
			}

			# 解析请求地址,并进行反向代理
			set $is_matched 0;
			if ($proxy_url ~* "^(http|ws)(s?):\/\/?([a-zA-Z0-9\-\.]+:?\d*)([^\?]*)") {
				set $is_matched 1;
				set $proxy_protocol http$2;
				set $proxy_host $3;
				set $proxy_uri $4;
				set $proxy_url $proxy_protocol://$proxy_host;
				rewrite ^ / break;
				proxy_pass $proxy_url;
			}
			# if ($is_matched = 1) {
				# return 200 '{"code": 404, "message": "已经匹配到了!", "proxy_url": $proxy_url}';
			# }
			# if ($is_matched = 0) {
				# return 200 '{"code": 404, "message": "The proxy url is invalid!", "proxy_url": $proxy_url}';
			# }
			# Host 主机名,为了避免目标服务做限制此处采用目标地址的 Host
			proxy_set_header Host $proxy_host;
			# X-Real-IP 将真实访问者的远端 IP 地址转发给代理服务器
			proxy_set_header X-Real-IP $remote_addr;
			# X-Forwarded-For 标记客户端通过代理连接到服务器的源 IP
			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
			# X-Forwarded-Host 标记客户端通过代理连接到服务器的原始主机
			proxy_set_header X-Forwarded-Host $host:$server_port;
			# X-Forwarded-Server 代理服务器的主机名
			proxy_set_header X-Forwarded-Server $host;
			# X-Forwarded-Port 定义客户端请求的原始端口
			proxy_set_header X-Forwarded-Port $server_port;
			# X-Forwarded-Proto 标记客户端通过代理连接到服务器的协议
			proxy_set_header X-Forwarded-Proto $scheme;
			# proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto;
		}
    }

三、效果演示


http://127.0.0.1/_proxy/http://127.0.0.1:83

http://127.0.0.1/_proxy/http://127.0.0.1:82

四、参考博客
Nginx动态反向代理(2022/11/12)-CSDN博客 文章浏览阅读4.5k次,点赞3次,收藏15次。工作中经常遇到需要在前端访问第三方平台接口的情况,前端直接访问会遇到跨域、http 禁止调用 https 等问题,故需要在后台通过 Nginx 进行反向代理。随着第三方平台的增加,反向代理配置文件越来越复杂,因此笔者在考虑通过参数传递目标地址实现动态反向代理,本文将详细介绍实现过程。_nginx动态反向代理https://blog.csdn.net/qq_44797987/article/details/127818406#comments_31357922

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1491530.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

03按键控制LED

上回讲到点亮一个LED     这次我们来实现用按键控制led 不带中断的方式 当然实例来源网络 加上自己整合 先熟悉流程 0.添加一个自己写的驱动库文件 为什么添加 笔者想的是一个项目工程希望能适应很多个应用场景需要什么直接在里面调用分装好的函数就行 1.如何添加文件以及…

C++ 快速排序快速选择OJ

目录 1、75. 颜色分类 2、912. 排序数组 3、 215. 数组中的第K个最大元素 4、LCR 159. 库存管理 III 1、75. 颜色分类 思路:利用快速排序思路,使用三指针分块进行优化。 [0,left]——小于key[left1,right-1]——等于key[right,nums.size()]——大于k…

Day 6.有名信号量(信号灯)、网络的相关概念和发端

有名信号量 1.创建: semget int semget(key_t key, int nsems, int semflg); 功能:创建一组信号量 参数:key:IPC对像的名字 nsems:信号量的数量 semflg:IPC_CREAT 返回值:成功返回信号量ID…

惠普 DsekJet GT 5810/5820常见问题及解决方法

1、HP DeskJet GT 5810/5820机器的屏幕出现“P”时,该如何操作? 当屏幕出现“P”时,放入A4纸,按住“进纸键”3秒即可,打印机会打印出一张校准页。 2、HP DeskJet GT 5810/5820机器的屏幕出现“A”时,该如何…

反射(重点)

1.反射的概述 Java给我们提供了一套API,使用这套API我们可以在运行时动态的获取指定对象所属的类,创建 运行时类的对象,调用指定的结构,(属性,方法)等 API: java.lang.Class:代表一个类 jav…

JSP实现数据传递与保存

1.HTML页面转换JSP页面 直接再HTML页面最顶端添加page指令,修改文件后缀名;反之; 2.JSP内置对象 对象 描述 request 每当客户端请求JSP页面时,JSP引擎会制造一个新的request对象来代表这个请求。 response 当服务器创建req…

keycloak-鉴权springboot

一、环境描述 keycloak鉴权springboot的方式,此处简单介绍,springboot官方也提供了demo https://github.com/keycloak/keycloak-quickstarts/tree/latest/spring/rest-authz-resource-server 以及文档说明 Securing Applications and Services Guide…

ruoyi-nbcio-plus的Vue3前端一些插件使用介绍(二)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址: http://122.227.135.243:9666 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码: https://gitee.com/nbach…

微信小程序自动化测试——微信小程序云测服务!

MiniTest 微信小程序云测服务是一套由微信测试团队自主研发,联合WeTest云真机能力,共同推出的微信小程序自动化测试服务。 服务基于云真机,支持开发者简单快捷地实现小程序智能化Monkey测试,录制回放,自定义测试和性能…

基于springboot+vue的医疗报销系统

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

YOLO算法改进Backbone系列之:RepViT

摘要:近年来,与轻量级卷积神经网络(cnn)相比,轻量级视觉变压器(ViTs)在资源受限的移动设备上表现出了更高的性能和更低的延迟。这种改进通常归功于多头自注意模块,它使模型能够学习全局表示。然而,轻量级vit和轻量级cn…

猫咪冻干的价格差别为什么那么大?价格实惠的主食冻干分享

随着养猫科学知识的普及,越来越多的铲屎官选择更符合猫咪饮食天性的主食冻干喂养。尽管有些铲屎官因价格犹豫,但像我这样的资深铲屎官深知其益处。尽管其价格稍高于烘焙粮和膨化粮,但主食冻干为猫咪健康带来的实际好处是无法估量的。 对于像我…

约课小程序有哪些功能

​约课小程序为教育机构、教师和学生提供了便捷的预约和管理服务,有效提升了教学效率和用户体验。在这篇文章中,我们将介绍约课小程序常见的功能,帮助教育机构更好地了解如何利用小程序来提升服务质量和管理效率。 1. **课程预约功能**&…

基于openKylin与RISC-V的MindSpore AI项目实践

项目目标: 在openKylin系统上安装和配置MindSpore框架。开发一个简单的图像分类模型,并在RISC-V平台上进行训练和推理。根据RISC-V的特性,对MindSpore框架进行必要的优化。 目录 项目目标: 训练模型 编写训练代码,设…

美易官方《盘前:美国股指期货温和走低》

美国股指期货在盘前交易中温和走低,市场情绪在美联储主席鲍威尔即将作证前显得谨慎。投资者对即将公布的证词内容充满期待,以寻求对美联储未来货币政策的更多线索。 鲍威尔即将在国会作证,这是市场关注的焦点事件之一。他的证词可能会对美元汇…

用有名管道实现进程AB之间的对话

题目 #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <errno.h> #include <fcntl.h> #include <string.h> #include <unistd.h> int main(int argc, const char *argv[]) {//创建一个有名管道文件if(mk…

【力扣白嫖日记】1045.买下所有产品的客户

前言 练习sql语句&#xff0c;所有题目来自于力扣&#xff08;https://leetcode.cn/problemset/database/&#xff09;的免费数据库练习题。 今日题目&#xff1a; 1045.买下所有产品的客户 表&#xff1a;Customer 列名类型customer_idintproduct_keyint 该表可能包含重复…

市场复盘总结 20240305

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 一支股票 10%的时候可以操作&#xff0c; 90%的时间适合空仓等待 二进三&#xff1a; 进级率中 25% 最常用的…

【打工日常】使用docker部署轻量的运维监控工具

一、Uptime-Kuma介绍 Uptime-Kuma是一个轻量级的自动化运维监控工具&#xff0c;最为引人注目的特点是其出色的监控Dashboard面板。部署简单&#xff0c;工具轻量又强大。而且&#xff0c;Uptime-Kuma是开源免费的&#xff0c;并支持基于Docker的部署方式。它支持网站、容器、数…

动静态库-动态库加载

动静态库 前言引入 一、静态库1. 创建静态库①原理②创建 2. 使用静态库①借助编译选项②只需要带库名 3. 小结 二、动态库1. 创建动态库2. 使用动态库 三、 动态库加载原理——进程地址空间1. 地址①程序没有被加载前的地址②程序加载后的地址 2. 原理①动态库的地址②原理 前…