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.pswp.cn/news/715238.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/715238.shtml
英文地址,請注明出處:http://en.pswp.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的文件。…