请教一个 nginx 转发请求后, uri 的%28%29 被还原成()的问题

查看 92|回复 6
作者:trzzzz   
背景:系统 A 会将 uri 放入签名方法中生成签名,有一个 uri 中的参数是包含()左右括号(生成签名的时候左右括号是%28%29 ),系统 A 调用 nginx 代理的系统 B 的服务,请求到达系统 B 后 uri 变成了左右括号导致签名不正确
我尝试直连系统 B ,签名能通过,但是走 nginx 签名就会出现上述的情况。下面是我的 nginx 配置
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    upstream B {
        server 127.0.0.1:5300;
    }
    server {
        listen       15300;
        location / {
            client_max_body_size  2048M;
            client_body_buffer_size 128K;
            proxy_connect_timeout 180s;
            proxy_read_timeout 180s;
            proxy_send_timeout 180s;
            proxy_pass http://B/;
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Original-URI $request_uri;
        }
    }
}
nginx.version=1.25.3
请教各位大佬我应该如何解决这个问题

Nginx, URI, 签名, Location

morenacl   
计算签名应该显式调用相同的编码方法
trzzzz
OP
  
@morenacl 是的,签名方法都一样,但是不同的是 A 服务器签名的时候 uri 中括号是%28%29 ,但经过 nginx 代理后到达服务器 B 的 uri 中就变成了()
NessajCN   
你说的究竟是生成完的签名进 B 验证还是 B 就是签名生成服务?
trzzzz
OP
  
@NessajCN A 生成签名到 B 后,B 是拿 request 里面的内容进行签名后对比 A 传来的签名。签名没办法被解析出来
ysc3839   
去掉 X-Original-URI 呢?
julyclyde   
proxy_pass 那个 B 后面为什么还带了“根目录”斜线呢?
您需要登录后才可以回帖 登录 | 立即注册

返回顶部