nginx反向代理时,url中包含转义字符导致400 bad request问题

Posted 小魏的马仔

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx反向代理时,url中包含转义字符导致400 bad request问题相关的知识,希望对你有一定的参考价值。

现象

我在nginx中,拦截了/api/相关接口,将此链接转到对应的9091端口进行处理。

然后前台调用的时候,返回bad request 400的错误

我将url中api前的端口号,人工加上之后,拼接了127.0.0.1:9091/api/……,测试是成功返回的

但是前台传入的127.0.0.1/api/……,处理失败。

由此,判断是nginx出现了问题

将url中的特殊字符全部删掉,发现nginx是可以正常跳转的,由此判断,是url出现了问题

解决

之前nginx的跳转逻辑如下:

location /api/        
	proxy_set_header Host $http_host;       
	proxy_set_header X-Forwarded-Proto $scheme;       
	proxy_set_header X-Real-IP  $remote_addr;       
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;       
	proxy_pass http://127.0.0.1:9091/;

通过查询,发现nginx可以实现不处理url后续的参数,直接转发,将判断逻辑做如下修改

将
	proxy_pass http://127.0.0.1:9091/;
改为
if ($request_uri ~* ^/(.*)$)           proxy_pass http://127.0.0.1:9091/$1;       
不对url进行处理

成功回调

以上是关于nginx反向代理时,url中包含转义字符导致400 bad request问题的主要内容,如果未能解决你的问题,请参考以下文章

nginx利用反向代理调试后台接口

nginx反向代理导致session失效的问题处理

nginx 反向代理和后端服务器获取真实 ip

java中反向转义org.apache.commons.lang3.StringEscapeUtils.unescapeJava

nginx反向代理(请求转发-URL匹配规则)

在传参时,url参数中包含+空格=%&#等特殊符号的处理