You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nginx反向代理URL参数失效,访问返回502 Bad Gateway求助

Nginx反向代理URL参数返回502 Bad Gateway的原因及解决办法

问题原因

  • URL参数编码导致解析失败:你访问的链接中,url参数里的http://会被浏览器自动编码为http%3A%2F%2F,Nginx直接使用$arg_url获取的是编码后的字符串,用这个作为代理目标时,Nginx无法正确解析,进而返回502。
  • Host头配置错误:你设置的proxy_set_header Host $proxy_host;,当proxy_pass使用变量时,$proxy_host会变成编码后的URL片段,而非目标服务器的真实主机名,目标服务器无法正确处理该请求,引发502错误。
  • 缺少参数合法性校验:直接将用户传入的$arg_url作为代理目标,不仅存在被滥用为代理跳板的安全风险,还可能因参数格式异常(比如缺失协议、包含非法字符)导致代理失败。

修复后的配置示例

location /redirect {
    # 解码URL参数中的编码内容
    set $decoded_url $arg_url;
    # 处理http和https的编码前缀
    if ($decoded_url ~* "^http%3A%2F%2F") {
        set $decoded_url "http://${decoded_url:10}";
    }
    if ($decoded_url ~* "^https%3A%2F%2F") {
        set $decoded_url "https://${decoded_url:11}";
    }

    proxy_pass $decoded_url;
    proxy_ssl_server_name on;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $http_connection;
    # 改用目标服务器的主机名,这里直接用$host即可
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
    client_max_body_size 100M;
    proxy_buffering off;
    proxy_buffer_size 16k;
    proxy_busy_buffers_size 24k;
    proxy_buffers 64 4k;
    proxy_redirect off;

    # 可选:添加域名白名单,仅允许代理指定网站,防止被滥用
    if ($decoded_url !~* "^https?://(google\.com|你的其他允许域名)") {
        return 403;
    }
}

额外说明

  • 解码步骤是核心,必须将编码后的URL转换为正常格式,Nginx才能正确识别代理目标。
  • 调整Host头是为了让目标服务器能正确识别请求,避免因主机名不匹配拒绝服务。
  • 添加白名单是安全必要项,否则你的服务器很可能被当作恶意代理使用。

内容的提问来源于stack exchange,提问作者leshcode

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 01:02:18