在nginx中用X-Accel-Redirect response header控制文件下载
2019独角兽企业重金招聘Python工程师标准>>>
在web应用中,常常会有文件需要下载。如果这些文件是非常私密的,直接用web服务器下载,就不能检查文件的下载权限。以往遇到这种需要权限的情况,都是用程序语言判定权限后,使用程序语言来读取文件并输出,这样就能解决权限问题。但是使用程序语言来读取文件又带来了效率上的问题,如果文件体积比较大或者下载并发数比较大,服务器很快就不堪重负。
基于这种情况,web服务器软件提供了相应的解决办法:使用一个response header来控制下载。目前squid、apache、lighttpd、nginx等http server都有支持这种方式,但是他们的response header的名字都不一样:
nginx: X-Accel-Redirect
squid: X-Accelerator-Vary
apache: X-Sendfile
lighttpd: X-Sendfile/X-LIGHTTPD-send-file
用response header控制下载的原理都大同小异:
当客户端发起请求下载某个文件时,因为并没有X-Accel-Redirect头,web服务器并不会立刻就把文件输出给客户端;而是将这个请求交给后端的程序语言,程序语言验证认为该客户端可以下载这个文件,就写出相应的X-Accel-Redirect头并结束处理;X-Accel-Redirect头返回时经过前端的web服务器,web服务器检查到这个头之后,才把文件输出到客户端。
那么,如果客户端伪造一个X-Accel-Redirect头来读取呢?当然也是不能下载的,因为web服务器只认识后端发来的X-Accel-Redirect头,客户端发来的不算。
于是下面就用nginx来实现上述的这个流程:
1、改变目录权限,客户端发起请求时,将这个目录的请求都交给后端
location /mp3/ { alias /data/html/mp3/; internal; error_page 403 =200 @backend ;
} location @backend { proxy_pass http://www.test.com;
}
这样,用户访问如http://www.test.com/mp3/1.mp3这样的地址时,将不能下载文件,nginx会把请求交给后端服务器。
2、在后端服务器配置一个rewrite
rewrite "^/mp3/(.*)\.mp3$" /read_file.do?id=$1 last;
这个rewrite的目的是把请求http://www. test.com/mp3/1.mp3指向到一个php程序语言上,由程序语言处理。
3、写一个java程序判断权限
httpResponse.setHeader("Content-Disposition", "attachment; filename=\""+filename+"\"");httpResponse.setHeader("Content-Type","application/octet-stream");httpResponse.setHeader("X-Accel-Redirect","/mp3/"+resource.get("res_url"));//给nginx返回实际文件存在的地址
这样,配置就完成了。
转载于:https://my.oschina.net/henrydong/blog/143217
在nginx中用X-Accel-Redirect response header控制文件下载相关推荐
- nginx 错误502 upstream sent too big header while reading response header from upst
原文参考:http://hi.baidu.com/wastorode/item/ec86ade6ac0af7a2c10d75f4 sudo gedit /var/log/nginx/error.log ...
- nginx响应超时upstream timed out (110: Connection timed out) while reading response header from upstream
问题描述 解决方法 提高nginx网络吞吐量buffers优化指令说明 nginx代理超时配置 nginx缓存区大小设置 问题描述 后台server服务响应时间正常,但是请求没有打到服务器,在ngin ...
- [temp]Nginx 错误502 upstream sent too big header while reading response header from upstream
Nginx 502 Bad Gateway的含义是请求的PHP-CGI已经执行,但是由于某种原因(一般是读取资源的问题)没有执行完毕而导致PHP-CGI进程终止. Nginx 504 Gateway ...
- Nginx 错误502 upstream sent too big header while reading response header from upstream
Nginx 502 Bad Gateway的含义是请求的PHP-CGI已经执行,但是由于某种原因(一般是读取资源的问题)没有执行完毕而导致PHP-CGI进程终止. Nginx 504 Gateway ...
- Response Header里的Server,X-Powered-By,X-AspNet-Version字段等敏感信息删除
Response Header里的Server,X-Powered-By,X-AspNet-Version字段等敏感信息删除 简介 通过抓包工具burpsuite或者fiddler抓取分析resp ...
- recv() failed (104: Connection reset by peer) while reading response header from upstream
场景:为了得到用户在线等实时信息,在客户端做了个ajax轮训,每隔5秒请求一次: 用户量一上来,于是问题就来了,页面各种卡nginx日志文件 [root@iZt web]# tail -f /data ...
- 解决 ”upstream prematurely closed connection while reading response header from upstream“ 问题,运行环境为:ngi
解决 "upstream prematurely closed connection while reading response header from upstream" 问题 ...
- upstream sent too big header while reading response header from upstream
年底了事情真多,club服务器有问必答 提交页面 提交出这个问题 The page you are looking for is temporarily unavailable.Please try ...
- 转:PHP--获取响应头(Response Header)方法
转:http://blog.sina.com.cn/s/blog_5f54f0be0102uvxu.html PHP--获取响应头(Response Header)方法 方法一: ========== ...
最新文章
- Python模块包中__init__.py文件的作用
- 金山词霸2012不能在PDF中取词 解决办法
- 在MAC下安装一些软件时提示来自身份不明开发者
- python leetcode_leetcode 刷题经验,主力 python
- 如何合理的规划一次 JVM 性能调优
- frp ---- golang编写的内网穿透工具简介
- HTML5格式问题,你遇到了吗?
- Java对象序列化原理以及Serializable接口
- c++万能头文件包含的头文件
- android singletask启动模式,android:Activity启动模式之singleTask(一)(示例代码)
- CATIA入门学习常见问题(一)
- Matlab实现分离变量法求解一维热传导方程的初边值问题
- csgo fps不稳定和服务器,CSGO fps不稳定,求FPS 优化设置
- 阿里物联网平台的使用
- core网络课程整理(core概述及启动讲解)
- 树形dp瞎讲+树形dp基础题题解
- Adobe带你解锁办会新技能
- 标准 BT656 并行 数据结构 详解
- 覃卫平java,湖南省职业教“十一五”省级重点建设项目验收通过的项目.doc
- Java项目:教师资格证报名系统(java+SpringBoot+vue+maven+mysql+elementui)
热门文章
- php文本分割成csv,php将文本文件转换csv输出的方法
- java中的後綴表達式_求Java堆栈,将中缀算术表达式转换成后缀表达式。
- MySQL数据库序列的作用_MySQL数据库:序列使用
- linux应用系统使用率,Linux性能优化实战:系统CPU使用率高,但为啥找不到高的应用(06)...
- 华为手机服务器响应,服务器响应优化
- 三层交换机能传递路由吗?_华为ensp三层交换机VLAN配置静态路由互通
- 《编译原理》实验教学大纲
- Asp.Net就业课之三验证控件
- Nginx 错误10013: An attempt was made to access a socket in a way forbidden
- 记录我对Padding Oracle攻击的分析和思考之抄写