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
相关产品推荐
相关产品推荐

