Nginx 动态反向代理配置与实现

356 阅读1分钟

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截取成功 image.png

核心配置

以下是实现动态反向代理的关键配置示例:

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;
}

成功访问到后端接口 image.png

image.png

解释配置项:
  1. 动态提取目标 URL
    if ($request_uri ~* "/?url=(.*)") 用于匹配 ?url= 后的部分,将其存储到变量 $proxy_url 中。$proxy_url 会作为后续 proxy_pass 的动态目标地址。

  2. 代理转发
    proxy_pass $proxy_url; 使用提取到的 $proxy_url 动态决定后端目标服务器。

  3. 请求头设置
    为了保持代理请求的来源信息和协议一致性,添加了如下请求头:

    • Host:使用客户端访问的原始主机名
    • X-Real-IP:记录客户端的真实 IP
    • X-Forwarded-For:保留代理链的 IP 信息
    • X-Forwarded-Proto:标明协议(HTTP/HTTPS)