1. 问题来源:
使用RESTful风格发送带有特殊符号(如:点、大括号等)的请求,当使用Nginx做地址映射时会返回报"HTTP Status 400-Bad Request"的错误,这个时候我们需要对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}