当前位置: 首页 > news >正文

[转载]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将允许适用于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

相关文章:

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

需求 统计静态文件的下载次数;判断用户是否有下载权限;根据用户指定下载速度;根据Referer判断是否需要防盗链;根据用户属性限制下载速度; X-Accel-Redirect This allows you to handle authentication, logging or …...

继电器的详细分类

继电器的分类方法较多,可以按作用原理、外形尺寸、保护特征、触点负载、产品用途等分类。 一、按作用原理分 1.电磁继电器 在输入电路内电流的作用下,由机械部件的相对运动产生预定响应的一种继电器。 它包括直流电磁继电器、交流电磁继电器、…...

docker的底层原理,带你上天

1、docker的层级怎么看 先查看当前机器上有哪些镜像 docker images 这里选看mysql的层级 docker image inspect mysql:5.7.29 命令。其中RootFS部分则是表示了分层信息。 2、查看docker的系统信息 因为这台机器的docker不是我安装的,所以不知道具体的根目录在哪里…...

HNU-电子测试平台与工具2-串口实验5次

计算机串口使用与测量 【实验属于电子测试平台与工具】 湖南大学信息科学与工程学院 计科 210X wolf (学号 202108010XXX) 0.环境搭建 在实验开始之前,安装好Ubuntu 20.04操作系统。(这个没有难度) 但要提醒的是,这个ubuntu是xubuntu,而且虚拟硬盘只有10GB的大小…...

Ext JS嵌套分组表格的实现

这里的嵌套分组表格指的是这样一种表格 表格的每一行可以展开下一层的Grid展开的嵌套表格是一个分组的表格显示的效果如下图: 这种显示的方式可以显示 3个层级的数据,比如这里的国家 、 将军等级、将军信息。 如果最外层再使用分组的表格, 则可以显示 4个层级的信息, 这种…...

【配电网重构】基于改进二进制粒子群算法的配电网重构研究(Matlab代码实现

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

Python编程语言简介

Python 是荷兰人 Guido van Rossum (吉多范罗苏姆,中国程序员称其为“龟叔”)在 1990 年初开发的一种解释型编程语言。 Python 的诞生是极具戏曲性的,据 Guido 自述记载,Python 语言是在圣诞节期间为了打发无聊的时间…...

ChatGPT国内免费访问

背景 ChatGPT作为一种基于人工智能技术的自然语言处理工具,近期的热度直接沸腾🌋。 作为一个程序员,我也忍不住做了一个基于ChatGPT的网站,免费!免梯子!!国内可直接对话ChatGPT,也…...

从零到无搭建Vue项目及代码风格规范

注:已经有vue项目的可以跳过项目初始化 Vue项目搭建 环境搭建 安装nvm 方便后续切换不通的node版本 nvm官网 傻瓜安装就行 或者搜下自己(非本文重点)nvm 安装好后 安装一个Node版本 本文使用的 有了环境开始创建Vue项目 打开命令行 cmd n…...

ASP.NET基于BS结构的实验室预约模型系统(源代码+论文)

《基于B/S结构的实验室预约模型系统》是采用ASP.NET开发的一个开放实验室预约系统。本系统是针对目前实验室手工管理效率低下,缺乏安全性、可控性等缺点,以校园网为依托,采用科学、高效的教学管理方式,使学校的教学资源得到充分的利用。本系统主要实现了教师根据实际教学情…...

Java货运物流园管理系统源码

技术架构:spring boot、mybatis、redis、vue、element-ui 开发语言:java、vue、uniapp 开发工具:idea、vscode、hbuilder 前端框架:vue 后端框架:spring boot 数 据 库:mysql 移 动 端: …...

Linux4.2LAMP

文章目录 计算机系统5G云计算第一章 LINUX LAMP一、概述二、编译安装Apache httpd服务1.关闭防火墙,将安装Apache所需软件包传到/opt目录下2.安装环境依赖包3.配置软件模块4.编译及安装5.优化配置文件路径,并把httpd服务的可执行程序文件放入路径环境变量…...

车载ECU休眠唤醒-TJA1145

前言 首先,请教大家几个小小问题,你清楚: 什么是TJA1145吗?你知道休眠唤醒控制基本逻辑是怎么样的吗?TJA1145又是如何控制ECU进行休眠唤醒的呢?使用TJA1145时有哪些注意事项呢? 今天&#xff…...

平衡二叉树的插入,删除以及平衡调整。

一,平衡二叉树插入失衡情况及解决方案 由于各种的插入导致的不平衡,每次调整都是最小不平衡子树。 LL:由于在结点A的 左孩子的左子树 插入结点导致失衡。 右单旋:①将A的 左孩子B 向右上旋转 代替A成为根节点       ②将A结…...

评价指标计算

混淆矩阵: 准确率(Precision):记为P_i,表示被正确预测为类别i的样本数占所有被预测为类别i的样本数的比例。 召回率(Recall):记为R_i,表示被正确预测为类别i的样本数占…...

Spring Boot如何实现OAuth2授权?

Spring Boot如何实现OAuth2授权? OAuth2是一种授权框架,用于授权第三方应用程序访问受保护的资源。在Web应用程序中,OAuth2通常用于授权用户访问受保护的API。 在本文中,我们将介绍如何使用Spring Boot实现OAuth2授权。我们将使…...

【最小生成树模型】

最小生成树(Minimum Spanning Tree)模型原理与应用 引言 最小生成树(Minimum Spanning Tree,简称MST)是图论中的经典问题之一,它在实际应用中有着广泛的应用。本文将介绍最小生成树模型的原理和应用&…...

【JavaSE】Java基础语法(三十):HashMap与TreeMap

文章目录 1. HashMap1.1 HashMap集合概述和特点1.2 HashMap集合应用案例 2. TreeMap2.1 TreeMap集合概述和特点2.2 TreeMap集合应用案例一2.3 TreeMap集合应用案例二 3. 总结 1. HashMap 1.1 HashMap集合概述和特点 HashMap底层是哈希表结构的依赖hashCode方法和equals方法保…...

Sangria:类似Nova folding scheme的relaxed PLONK for PLONK

1. 引言 前序博客有: Nova: Recursive Zero-Knowledge Arguments from Folding Schemes学习笔记SuperNova:为多指令虚拟机执行提供递归证明基于Nova/SuperNova的zkVMSangria:PLONK Folding2023年 ZK Hack以及ZK Summit 亮点记 主要见2023…...

【蓝桥杯省赛真题22】python剩余空间问题 青少年组蓝桥杯比赛python编程省赛真题解析

目录 python剩余空间问题 一、题目要求 1、编程实现 二、解题思路...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要&#xff1a; 近期&#xff0c;在使用较新版本的OpenSSH客户端连接老旧SSH服务器时&#xff0c;会遇到 "no matching key exchange method found"​, "n…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 &#x1f37a; 最新版brew安装慢到怀疑人生&#xff1f;别怕&#xff0c;教你轻松起飞&#xff01; 最近Homebrew更新至最新版&#xff0c;每次执行 brew 命令时都会自动从官方地址 https://formulae.…...