[转载]Nginx 使用 X-Accel-Redirect 实现静态文件下载的统计、鉴权、防盗链、限速等

news/2024/11/29 6:53:11/

需求

  • 统计静态文件的下载次数;
  • 判断用户是否有下载权限;
  • 根据用户指定下载速度;
  • 根据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将允许适用于CometHTTP流式应用程序的无缓冲响应。将此设置为yes将允许响应被缓存。默认yes

X-Accel-Expires

如果已传输过的文件被缓存下载,设置Nginx文件缓存过期时间,单位秒。默认不过期。

X-Accel-Charset

设置文件字符集,默认UTF-8

使用条件

  • 必须有Nginx作为后端服务的代理;
  • 必须访问Nginx的代理地址,直接访问后端服务Nginx会报404
  • 可自行配置Content-Type来控制是下载(application/octet-stream)还是展示(image/jpeg等);

代码实现

  1. Nginx监听9876端口。
  2. Nginx代理后端服务的8080端口。
  3. 设置/testAccel路径为internal,指定具体文件存储的磁盘位置。
  4. 后端服务接收到文件下载请求,处理业务逻辑后X-Accel-Redirect/testAccel路径。
  5. Nginx收到后端返回信息中的X-Accel-Redirect请求头,接管文件下载或显示任务。
  6. 请求路径: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) {//统计//鉴权//判断RefererString 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

分类: springmvc , nginx


http://www.ppmy.cn/news/181314.html

相关文章

MXPlayer ac3音轨支持问题

下载的MXPlayer 在播放kvm视频的时候没有声音, 说是不支持ac3的音频 到官网下载单独的解码包: https://mxplayerdownloads.com/mx-player-ac3-dts-codec-apk-zip-download 具体的根据自己的MXPlayer平台及版本, 这里记录一下我的安装过程 android平台, MXPlayer 1.8.6, 下载下面…

ps aux的意思

ps (process status) : 进程状态 参数 描述 a 显示所有进程(包括其他用户的进程) u 用户以及其他详细信息 x 显示没有控制终端的进程

雅佳5000音色中英文对照表 AKAI EWI5000

其中 9/11/31/45/67/78/84/89号音色特别有特点悦耳

AudioTrack播放acc格式音频

AudioTrack本身只支持播放pcm格式音频,想要使用AudioTrack播放acc格式音频,还需要其他api来进行数据封装。 MediaExtractor MediaCodec package com.zero.demo;/** * Created by yingkun_che on 19-6-19. * 使用AudioTrack 播放acc音频测试 */ import…

AUXR AUXR1

博主发现在STC89C51RC/RD的说明手册上没有辅助寄存器AUXR的内容,但是STP-ISP烧录软件上的提供的定时器代码里有这样一项设置。 STC15系列用户手册 P487 STC-ISP提供的代码 /——————————————————————————————/ 8.6更新: …

常见AU AAX VST3音乐音频处理插件安装目录

Logic Pro X 常见AU AAX VST3音乐音频处理插件安装目录 AU /Library/Audio/Plug-Ins/Components/ VST3 /Library/Audio/Plug-Ins/VST3/ AAX /Library/Application\ Support/Avid/Audio/Plug-Ins/

AU声音处理参数

参考:1.让你视频的声音更好听②[EQ均衡器]女声甜美动人男声低沉性感 如何让你视频的人声更好听|fcpx音频调整小技巧 男声 使用右下角的LP,低通滤波器(通过低频,衰弱高频)因为男生一般是提高中低音&#xf…