nginx 根据参数动态代理

一、问题描述

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 urlif ($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 urlif ($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 主机名,为了避免目标服务做限制此处采用目标地址的 Hostproxy_set_header Host $proxy_host;# X-Real-IP 将真实访问者的远端 IP 地址转发给代理服务器proxy_set_header X-Real-IP $remote_addr;# X-Forwarded-For 标记客户端通过代理连接到服务器的源 IPproxy_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.mzph.cn/news/715238.shtml

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

相关文章

腾讯云优惠券领取入口_先领取再下单_2024腾讯云优惠攻略

腾讯云优惠代金券领取入口共三个渠道,腾讯云新用户和老用户均可领取8888元代金券,可用于云服务器等产品购买、续费和升级使用,阿腾云atengyun.com整理腾讯云优惠券(代金券)领取入口、代金券查询、优惠券兑换码使用方法…

在Windows下运行命令行程序,如何才能不显示命令行窗口,让程序保持后台运行?

在Windows下,有几种方法可以使命令行程序在后台运行而不显示命令行窗口。以下是其中的一些方法: 一. 使用start命令 你可以使用start命令来启动程序,并将窗口样式设置为最小化。例如: cmd start /b your_program.exe这里的/b选…

【硬件相关】IB网/以太网基础介绍及部署实践

文章目录 一、前言1、Infiniband网络1.1、网络类型1.2、网络拓扑1.3、硬件设备1.3.1、网卡1.3.2、连接线缆a、光模块b、线缆 1.3.4、交换机 2、Ethernet网络 二、部署实践(以太网)1、Intel E810-XXVDA21.1、网卡信息1.2、检查命令1.2、驱动编译 2、Mella…

volatile 关键字 (二)

volatile 关键字 (二) 文章目录 volatile 关键字 (二)volatile 可以保证原子性么? 文章来自Java Guide 用于学习如有侵权,立即删除 volatile 可以保证原子性么? volatile 关键字能保证变量的可…

nextjs中_app.tsx下划线什么作用

在Next.js中,_app.tsx(或_app.js)是一个特殊的文件,用于初始化页面。下划线_前缀在文件名中具有特定的意义,它告诉Next.js这个文件是一个特殊的内置文件,用于覆盖或扩展默认的App行为。 具体来说&#xff…

Python 潮流周刊第 40 期(摘要)

本周刊由 Python猫 出品,精心筛选国内外的 250 信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进 Python 技术,并增长职业和副业的收入。 周刊全文:h…

C++_数据结构_数据的输入

作用 用于从键盘获取数据 关键字 cin >> 变量示例

YOLOv5论文作图教程(3)— 关于论文作图教程系列采用线上培训的通知(终结篇)

前言:Hello大家好,我是小哥谈。YOLOv5论文作图教程系列其实是我特别擅长的一个模块(本人产品经理出身),自从本系列发表了两篇文章之后,一直没有再继续更新,主要原因是通过文字无法比较好的表达软件的功能及使用,并且也无法达到比较好的培训效果。为了确保大家可以彻底掌…

数据库原理(一)

1、基本概念 学号姓名性别出生年月籍贯220101张三男2003江苏220102李四男2003山东220103王五女2003河北220104赵六女2003天津220105张四男2003北京220106李五女2003江苏220107王六女2003山东220108张七男2003河北220109张九男2003天津220110李十女2003北京 1.1数据&#xff0…

基于springboot+vue的相亲网站

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

软考54-上午题-【数据库】-关系模式的范式-真题

一、范式总结 第一步,先求候选码,由此得到:主属性、非主属性。 二、判断部分函数依赖的技巧 【回顾】:部分函数依赖 (X,Y)——>Z; X——>Z 或者 Y——>Z 题型:给…

全量知识系统问题及SmartChat给出的答复 之13 解析器+DDD+文法型 之2

Q36. 知识系统中设计的三种文法解析器和设计模式之间的关系 进一步,我想将 知识系统中设计的三种语言(形式语言、人工语言和自然)的文法解析器和DDD中的三种程序类型(领域模型、领域实体和领域服务) 形式语言文法 我…

Java中的图数据库应用:Neo4j入门

第1章:引言 在数据驱动的时代,咱们处理的不仅仅是数字和文本,还有复杂的关系和网络。想象一下社交网络中人与人之间错综复杂的联系,或者是互联网上网页之间的链接关系,传统的表格数据库已经难以高效地处理这些关系密集…

每日leetcode--最大数

正题之前 三玖yyds!!! 题目 给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。 注意:输出结果可能非常大,所以你需要返回一个字符串而不是整…

篮球游戏中的挑战精神与怄气心理:扣篮被帽后的再度冲击

在篮球比赛中,扣篮无疑是最具观赏性和震撼力的动作之一,它展示了球员的爆发力、技巧和自信。而在篮球游戏中,玩家即便面临连续扣篮被盖帽的挫折,仍渴望继续杀入内线尝试扣篮的现象,实则是体育竞技精神、挑战意识与怄气…

梵宁教育:警惕网络诈骗,守护青春未来

随着互联网的普及和科技的飞速发展,网络已经深入到了我们生活的方方面面,为大学生提供了前所未有的便利与机遇。然而,与此同时,网络诈骗也悄然滋生,成为威胁大学生安全的一大隐患。梵宁教育在此郑重提醒广大大学生&…

LeetCode 热题100 刷题笔记

一:哈希表 一般哈希表都是用来快速判断一个元素是否出现集合里。 直白来讲其实数组就是一张哈希表,哈希表中关键码就是数组的索引下标,然后通过下标直接访问数组中的元素。 1.两数之和 题目链接:. - 力扣(LeetCode…

Javaweb之SpringBootWeb案例之自动配置的原理分析的详细解析

3.2.3 原理分析 3.2.3.1 源码跟踪 前面我们讲解了在项目当中引入第三方依赖之后,如何加载第三方依赖中定义好的bean对象以及配置类,从而完成自动配置操作。那下面我们通过源码跟踪的形式来剖析下SpringBoot底层到底是如何完成自动配置的。 源码跟踪技巧…

[VSCode插件] 轻量级静态博客 - MDBlog

MDBlog VSCode插件,基于Markdown的轻量级静态博客系统,同时支持导出为可以部署的静态博客。 仓库 MDBlog 1. Features 博客基础功能:分类管理、文章管理、自动生成索引快捷指令:快捷输入表格、mermaid、wavedrom、代码块发布&a…

[electron杂项] 记录学习electron碰到问题(持续更新)

无法生成 node_modules文件夹 如前面所说的,如果要用vscode的代码补全,那么就要把 electron.d.ts文件拷贝到项目的 node_modules文件夹下。一般情况下是通过npm install生成 node_modules 文件夹。但是有时发现根本生成不了生成了一个 xxxxlock的文件。…