Nginx 使用 X-Accel-Redirect 实现静态文件下载的统计、鉴权、防盗链、限速等
2021/7/7 7:06:44
本文主要是介绍Nginx 使用 X-Accel-Redirect 实现静态文件下载的统计、鉴权、防盗链、限速等,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
需求
- 统计静态文件的下载次数;
- 判断用户是否有下载权限;
- 根据用户指定下载速度;
- 根据Referer判断是否需要防盗链;
- 根据用户属性限制下载速度;
X-Accel-Redirect
This allows you to handle authentication, logging or whatever else you please in your backend and then have NGINX handle serving the contents from redirected location to the end user, thus freeing up the backend to handle other requests. This feature is commonly known as X-Sendfile.
这个功能允许你在后端处理权限,日志或任何你想干的,Nginx提供内容服务给终端用户从重定向后的路径,因此可以释放后端去处理其他请求(直接由Nginx提供IO,而不是后端服务)。这个功能类似 X-Sendfile 。
不同Web
服务器,相同功能,不同的标识:
nginx: X-Accel-Redirect
squid: X-Accelerator-Vary
apache: X-Sendfile
lighttpd: X-Sendfile/X-LIGHTTPD-send-file
X-Accel-Limit-Rate
限制下载速度,单位字节。默认不限速度。
X-Accel-Buffering
设置此连接的代理缓存,将此设置为no
将允许适用于Comet
和HTTP
流式应用程序的无缓冲响应。将此设置为yes
将允许响应被缓存。默认yes
。
X-Accel-Expires
如果已传输过的文件被缓存下载,设置Nginx
文件缓存过期时间,单位秒。默认不过期。
X-Accel-Charset
设置文件字符集,默认UTF-8
使用条件
- 必须有
Nginx
作为后端服务的代理; - 必须访问
Nginx
的代理地址,直接访问后端服务Nginx
会报404
; - 可自行配置
Content-Type
来控制是下载(application/octet-stream
)还是展示(image/jpeg
等);
代码实现
Nginx
监听9876
端口。Nginx
代理后端服务的8080
端口。- 设置
/testAccel
路径为internal
,指定具体文件存储的磁盘位置。 - 后端服务接收到文件下载请求,处理业务逻辑后
X-Accel-Redirect
到/testAccel
路径。 Nginx
收到后端返回信息中的X-Accel-Redirect
请求头,接管文件下载或显示任务。- 请求路径:http://localhost:9876/file/download/1234.jpg。
Nginx
配置:
location / { #root html; root F:/web/; index index.html index.htm; try_files $uri $uri/ /index.html; } location /testAccel { internal; alias F:/web/testAccel/file; } location /file { proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://127.0.0.1:8080; }
Java
代码
注意fileName
添加:.+
,或者获取不到文件后缀名。
@GetMapping("/file/download/{fileName:.+}") public void download(HttpServletRequest request, HttpServletResponse response, @PathVariable("fileName") String fileName) { //统计 //鉴权 //判断Referer String referer = request.getHeader("Referer"); System.out.println(referer); String prefix = "/testAccel"; // 在这之前进行一些必要的处理,比如鉴权,或者其它的处理逻辑。 // 通过X-Accel-Redirect返回在nginx中的实际下载地址 response.setHeader("X-Accel-Redirect", prefix + "/" + fileName); response.setHeader("X-Accel-Limit-Rate", "1024");//限速,单位字节,默认不限 response.setHeader("X-Accel-Buffering", "yes");//是否使用Nginx缓存,默认yes }
如果直接访问路径:http://localhost:9876/testAccel/1234.jpg,就会报404错误
参考:
https://www.zhangbj.com/p/507.html
这篇关于Nginx 使用 X-Accel-Redirect 实现静态文件下载的统计、鉴权、防盗链、限速等的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-10-29Nginx发布学习:从入门到实践的简单教程
- 2024-10-28Nginx发布:新手入门教程
- 2024-10-21nginx 怎么设置文件上传最大20M限制-icode9专业技术文章分享
- 2024-10-17关闭 nginx的命令是什么?-icode9专业技术文章分享
- 2024-09-17Nginx实用篇:实现负载均衡、限流与动静分离
- 2024-08-21宝塔nginx新增8022端口方法步骤-icode9专业技术文章分享
- 2024-08-21nginx配置,让ws升级为wss访问的方法步骤-icode9专业技术文章分享
- 2024-08-15nginx ws代理配置方法步骤-icode9专业技术文章分享
- 2024-08-14nginx 让访问带有/relid的地址返回404 ,例子 /relid-x-0.36-y-131.html-icode9专业技术文章分享
- 2024-08-14nginx 判断地址有/statics/的路径,指向到/home/html/statics/目录-icode9专业技术文章分享