nginx 配置代理,根据 不同的请求头进行转发至不同的代理
解决场景:下载发票的版式文件,第三方返回的是url链接地址,但是服务是部署在内网环境,无法访问互联网进行下载。此时需要进行走反向代理出去,如果按照已有套路,就是根据不同的访问前缀,跳转不同的location,我们有四十几个路径,就需要配置40多个location ,比较繁琐。此时可以使用nginx里的map 属性,进行配置,配置如下:
nginx配置文件
#user nobody;
worker_processes 6;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 65535 ;
}
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 120s;
#gzip on;
# 增大 map_hash_bucket_size 的值,可以根据实际情况调整大小
map_hash_bucket_size 200;
# 定义映射关系
map $http_x_target_server $target_server {
default "";
"pubapi.jcsk100.com" "https://pubapi.jcsk100.com";
"rocgw.jcsk100.com" "https://rocgw.jcsk100.com/external/";
"taxsapivip.jcsk100.com" "https://taxsapivip.jcsk100.com/v1/api/s";
"taxsapi.holytax.com" "https://taxsapi.holytax.com/v1/api/s";
"dppt.shanghai.chinatax.gov.cn" "https://dppt.shanghai.chinatax.gov.cn:8443";
"dppt.guangdong.chinatax.gov.cn" "https://dppt.guangdong.chinatax.gov.cn:8443";
"dppt.xiamen.chinatax.gov.cn" "https://dppt.xiamen.chinatax.gov.cn:8443";
"dppt.tianjin.chinatax.gov.cn" "https://dppt.tianjin.chinatax.gov.cn:8443";
"dppt.chongqing.chinatax.gov.cn" "https://dppt.chongqing.chinatax.gov.cn:8443";
"dppt.neimenggu.chinatax.gov.cn" "https://dppt.neimenggu.chinatax.gov.cn:8443";
"dppt.dalian.chinatax.gov.cn" "https://dppt.dalian.chinatax.gov.cn:8443";
"dppt.qingdao.chinatax.gov.cn" "https://dppt.qingdao.chinatax.gov.cn:8443";
"dppt.shaanxi.chinatax.gov.cn" "https://dppt.shaanxi.chinatax.gov.cn:8443";
"dppt.sichuan.chinatax.gov.cn" "https://dppt.sichuan.chinatax.gov.cn:8443";
"dppt.henan.chinatax.gov.cn" "https://dppt.henan.chinatax.gov.cn:8443";
"dppt.fujian.chinatax.gov.cn" "https://dppt.fujian.chinatax.gov.cn:8443";
"dppt.jilin.chinatax.gov.cn" "https://dppt.jilin.chinatax.gov.cn:8443";
"dppt.yunnan.chinatax.gov.cn" "https://dppt.yunnan.chinatax.gov.cn:8443";
"dppt.ningbo.chinatax.gov.cn" "https://dppt.ningbo.chinatax.gov.cn:8443";
"dppt.shenzhen.chinatax.gov.cn" "https://dppt.shenzhen.chinatax.gov.cn:8443";
"dppt.gansu.chinatax.gov.cn" "https://dppt.gansu.chinatax.gov.cn:8443";
"dppt.shanxi.chinatax.gov.cn" "https://dppt.shanxi.chinatax.gov.cn:8443";
"dppt.zhejiang.chinatax.gov.cn" "https://dppt.zhejiang.chinatax.gov.cn:8443";
"dppt.hainan.chinatax.gov.cn" "https://dppt.hainan.chinatax.gov.cn:8443";
"dppt.liaoning.chinatax.gov.cn" "https://dppt.liaoning.chinatax.gov.cn:8443";
"dppt.jiangsu.chinatax.gov.cn" "https://dppt.jiangsu.chinatax.gov.cn:8443";
"dppt.jiangxi.chinatax.gov.cn" "https://dppt.jiangxi.chinatax.gov.cn:8443";
"dppt.guangxi.chinatax.gov.cn" "https://dppt.guangxi.chinatax.gov.cn:8443";
"dppt.hebei.chinatax.gov.cn" "https://dppt.hebei.chinatax.gov.cn:8443";
"dppt.heilongjiang.chinatax.gov.cn" "https://dppt.heilongjiang.chinatax.gov.cn:8443";
"dppt.xinjiang.chinatax.gov.cn" "https://dppt.xinjiang.chinatax.gov.cn:8443";
"dppt.hubei.chinatax.gov.cn" "https://dppt.hubei.chinatax.gov.cn:8443";
"dppt.beijing.chinatax.gov.cn" "https://dppt.beijing.chinatax.gov.cn:8443";
"dppt.anhui.chinatax.gov.cn" "https://dppt.anhui.chinatax.gov.cn:8443";
"dppt.shandong.chinatax.gov.cn" "https://dppt.shandong.chinatax.gov.cn:8443";
"dppt.hunan.chinatax.gov.cn" "https://dppt.hunan.chinatax.gov.cn:8443";
"dppt.guizhou.chinatax.gov.cn" "https://dppt.guizhou.chinatax.gov.cn:8443";
"dppt.xizang.chinatax.gov.cn" "https://dppt.xizang.chinatax.gov.cn:8443";
"dppt.ningxia.chinatax.gov.cn" "https://dppt.ningxia.chinatax.gov.cn:8443";
"dppt.qinghai.chinatax.gov.cn" "https://dppt.qinghai.chinatax.gov.cn:8443";
}
#代理地址
server {
listen 8444;
location / {
# 响应头打印 $http_x_target_server 和 $target_server 的值
add_header X-Target-Server $http_x_target_server;
add_header Target-Server $target_server;
# 默认不传给北京的地址
if ($target_server = "") {
set $target_server "https://dppt.beijing.chinatax.gov.cn:8443";
}
proxy_pass $target_server;
proxy_cache off;
proxy_redirect off;
proxy_connect_timeout 5m;
proxy_send_timeout 5m;
proxy_read_timeout 5m;
proxy_buffer_size 10m;
proxy_buffers 256 10m;
proxy_busy_buffers_size 10m;
proxy_temp_file_write_size 10m;
add_header Cache-Control no-cache;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
# 添加 resolver 指令,使用 Google 的公共 DNS 服务器,根据项目上的情况进行配置,使用$target_server必须配置,写死地址则不需要
resolver 8.8.8.8;
}
Java代码:
// header 传入nginx里的key即可 就会指定到对应的目标server里
URL url = new URL(urlString);
URLConnection connection = url.openConnection();
connection.setRequestProperty("X-Target-Server", header);
验证方式:
可以在响应头中,查看具体访问的代理地址。