一、问题背景

客户内网服务器不能直接访问外网,需要通过一台跳板机才能访问外网,在跳板机安装Nginx反向代理外网接口服务,架构图如下:
nginx反向代理结构图
代理设置完成后,在联调过程中请求外网接口返回参数错误,但是外网环境下不经过Nginx代理直接访问外网接口则能正常访问,说明在经过Nginx代理时,部分参数丢失了。

二、问题排查

根据接口报错,定位到是HTTPheader中的一个自定义参数client_id参数经过Nginx代理时没有转发出去,问题出现在Nginx代理上。

Nginx主配置文件nginx.conf内容如下

user  root;
worker_processes  1;

error_log  logs/error.log;
error_log  logs/error.log  notice;
error_log  logs/error.log  info;

pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  0;
    #keepalive_timeout  65;

    gzip  on;
    include /usr/local/nginx/conf/conf.d/*.conf;

}

Nginx代理配置内容如下:

server {
    listen       9000;
    server_name  localhost;
 
    location /mobile/verify {
        proxy_pass https://www.cmpassport.com/openapi/rs/tokenValidate;
        proxy_read_timeout 60;
        proxy_connect_timeout 60;
        proxy_redirect off;
    
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

通过查阅文档得知,Nginx默认会忽略http header中带有下划线的参数:
Nginx Syntax

三、解决方案

在nginx配置文件的http或server模块设置underscores_in_headerson:

#该属性默认为off,表示如果header name中包含下划线,则忽略掉。
underscores_in_headers on;

更新配置文件后重启Nginx,问题解决。