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

使用NGINX反向代理时后端服务无法接收&符号的问题

问题原因

当请求URL为/data?action=httpd/v1/CompareAnimals?animal=cat&bird=high时,NGINX会将URL中的&识别为参数分隔符,因此会把请求解析成两个独立参数:

  • action=httpd/v1/CompareAnimals?animal=cat
  • bird=high
    这就导致$arg_action变量只能获取到第一个&之前的内容,后续的bird=high被剥离成单独参数,无法传递给后端服务。
解决方案

方法1:通过正则捕获完整的action参数值

在server块中添加变量定义,从$request_uri中捕获完整的action参数内容,再传递给后端:

# 在server块内定义变量
set $full_action "";
if ($request_uri ~* "^/data\?action=(.*)$") {
    set $full_action $1;
}

location /data {    
    proxy_redirect off;      
    proxy_pass http://$backend/$full_action; 
}

这里利用$request_uri保留了原始请求的完整查询字符串,通过正则捕获action=之后的所有内容,确保包含其中的&符号。

方法2:使用rewrite重写请求路径

直接通过rewrite指令将请求路径重写为action参数的完整值,再转发到后端:

location /data {    
    proxy_redirect off;
    # 捕获action参数的完整内容并重写路径
    rewrite ^/data\?action=(.*)$ /$1 break;      
    proxy_pass http://$backend; 
}

rewrite指令会将请求路径替换为action参数的完整值,包括其中的&和后续参数,再转发到上游服务。

注意事项

  • 你配置中写的proxy_bypass应为proxy_pass,proxy_bypass的作用是决定是否跳过代理直接返回内容,并非用于转发请求到后端服务,需要修正该指令。

内容的提问来源于stack exchange,提问作者Mustafa Al-Metrami

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 16:29:59