1. 问题来源:

使用RESTful风格发送带有特殊符号(如:点、大括号等)的请求,当使用Nginx做地址映射时会返回报"HTTP Status 400-Bad Request"的错误,这个时候我们需要对Nginx的映射方式做一下调整。

处理Nginx映射带特殊符号的参数地址时报400的问题_Nginx

2. 解决方案

2.1 请求地址

http://678910.top/sms/menu/{12345678}

http://678910.top/sms/menu/111.222

以下这样的也生效,只要前面匹配上就行,都能对最后的特殊符号进行处理

http://678910.top/sms/menu/edit/{12345678}

http://678910.top/sms/menu/edit/111.222

2.2 Nginx配置

location /sms/menu {
# 原映射方式
# proxy_pass http://system/menu;
# 新的映射方式
if ($request_uri ~* ^/sms/menu/(.*)$) {
proxy_pass http://system/menu/$1;
}
# header信息设置
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-Proto $scheme;
}

释义:

1. $request_uri表示完整url去除最前面$host剩下的部分​,如:

http://678910.top/sms/menu/{12345678},去除​$host后剩下的部分就是:​/sms/menu/{12345678}



2. ​匹配正则表达式时,匹配到的值,从左到右分别对应$1、$2、$3、…、、$8、$9,如以上Nginx中匹配的$1 = {12345678}