解决场景:下载发票的版式文件,第三方返回的是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);
验证方式:
可以在响应头中,查看具体访问的代理地址。