Nginx 动态反向代理配置与实现
前言
在传统的反向代理中,目标后端服务器的地址通常是固定的,通过 proxy_pass
指定。然而,在某些应用场景中,需要展示不同厂商的数据,这时就需要请求不同的URL
地址。这时,Nginx
的动态反向代理功能能够满足这样的需求。
动态反向代理配置
URL 截取
location /proxy/ {
if ($request_uri ~* "/?url=(.*)") {
set $proxy_url $1;
}
default_type application/json;
return 200 '{"code": 200 "message": "截取?url=后的所有参数", "data": $proxy_url }';
}
使用js
访问Nginx
接口
fetch('/proxy/?url=http://192.168.8.251:8088/backgroundManagementSystem/api/test&eng=1').then(data=>{
console.log(data)
})
从控制台中可以看到url
截取成功
核心配置
以下是实现动态反向代理的关键配置示例:
location /proxy/ {
# 从请求参数中提取 URL
if ($request_uri ~* "/?url=(.*)") {
set $proxy_url $1;
}
# 动态代理到目标地址
proxy_pass $proxy_url;
# 设置必要的请求头
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
成功访问到后端接口
解释配置项:
-
动态提取目标 URL
if ($request_uri ~* "/?url=(.*)")
用于匹配?url=
后的部分,将其存储到变量$proxy_url
中。$proxy_url
会作为后续proxy_pass
的动态目标地址。 -
代理转发
proxy_pass $proxy_url;
使用提取到的$proxy_url
动态决定后端目标服务器。 -
请求头设置
为了保持代理请求的来源信息和协议一致性,添加了如下请求头:Host
:使用客户端访问的原始主机名X-Real-IP
:记录客户端的真实 IPX-Forwarded-For
:保留代理链的 IP 信息X-Forwarded-Proto
:标明协议(HTTP/HTTPS)