通过代理转发静态文件URL实现文件传输下载

545 阅读1分钟

一、问题背景

与第三方平台合作售卖产品,交易过程中产出交易证明的pdf文件(含客户敏感信息),第三方需要实现对客户开放的文件预览及下载。 文件所在服务器在公司内网区无法对外,一般通过外网区转发实现对外。

二、解决方案

  1. 我方将文件放置本地服务器,第三方定时通过sftp来下载该文件,并完成后续给客户的预览下载功能。
  2. 我方提供文件的静态访问url,第三方直接挂载在前端页面给客户预览及展示。

方案一第三方觉得麻烦不接受,方案二存在安全问题我方拒绝全外网开放(固定规范的url直接暴露在互联网,存在被暴力枚举从而下载到文件),最终折中方案是我方提供静态访问url,但只放开端对端的网络权限给第三方,由第三方通过url下载在本地自行实现前端预览展示。

三、处理过程

  1. 内网后端服务器继承实现WebMvcConfigurer,将本地文件转成可访问资源url上。
@Component
public class PhotoUtils implements WebMvcConfigurer {

    @Value
    private String imgPath;

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {

        registry.addResourceHandler("/image/**").addResourceLocations("file:" + imgPath);
    }
}
  1. 外网服务器Nginx配置转发
  • 配置Nginx IP转发:监听对该服务器8080端口的访问,并且限定仅当访问源是10.120.11.1时将请求转发至10.110.11.1:8081
#按ip端口做代理转发
stream{
    #添加转发的代理
    upstream transmit{
        hash $remote_addr consistent;
        # 转发的目的地址和端口
        server  10.110.11.1:8081;
    }
	
    #提供转发服务
    server{
        listen 8080;
        #允许访问IP
        allow 10.120.11.1;
        #限制访问IP
        deny all;
        #转发至代理服务器
        proxy_pass transmit;
    }
}
  • 配置Nginx 访问路径转发:监听对该服务器8080端口的访问,并且访问路径匹配/server/image/* 时将请求转发至10.110.11.1:8081
#按请求路径做代理转发
http {
	#添加转发的代理
    upstream image-server{
        hash $remote_addr consistent;
        # 转发的目的地址和端口,也可以是域名
        server  10.110.11.1:8081;
    }
	
    #提供转发服务
    server{
        listen 8080;
        
        location ^~ /server/image/ {
             proxy_pass http://image-server$request_uri;
        }
    }
}
  • 因为信创替换,需要在东方通中配置静态文件访问转发:监听对该服务器8080端口的访问,访问路径正则匹配/server/image/* 时将请求转发至10.110.11.1:8081
#在虚拟主机中正则匹配静态文件路径做转发
<VirtualHost 10.110.11.2:8080>

ProxyPassMatch ^(/server/image/.*\.pdf)$ http://10.153.201.119:22010

</VirtualHost>