使用NGINX反向代理时后端服务无法接收&符号的问题
问题原因
当请求URL为/data?action=httpd/v1/CompareAnimals?animal=cat&bird=high时,NGINX会将URL中的&识别为参数分隔符,因此会把请求解析成两个独立参数:
action=httpd/v1/CompareAnimals?animal=catbird=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
相关产品推荐
相关产品推荐

