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控制文件下载相关推荐

  1. 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 ...

  2. nginx响应超时upstream timed out (110: Connection timed out) while reading response header from upstream

    问题描述 解决方法 提高nginx网络吞吐量buffers优化指令说明 nginx代理超时配置 nginx缓存区大小设置 问题描述 后台server服务响应时间正常,但是请求没有打到服务器,在ngin ...

  3. [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 ...

  4. Nginx 错误502 upstream sent too big header while reading response header from upstream

    Nginx 502 Bad Gateway的含义是请求的PHP-CGI已经执行,但是由于某种原因(一般是读取资源的问题)没有执行完毕而导致PHP-CGI进程终止. Nginx 504 Gateway ...

  5. Response Header里的Server,X-Powered-By,X-AspNet-Version字段等敏感信息删除

    Response Header里的Server,X-Powered-By,X-AspNet-Version字段等敏感信息删除   简介 通过抓包工具burpsuite或者fiddler抓取分析resp ...

  6. recv() failed (104: Connection reset by peer) while reading response header from upstream

    场景:为了得到用户在线等实时信息,在客户端做了个ajax轮训,每隔5秒请求一次: 用户量一上来,于是问题就来了,页面各种卡nginx日志文件 [root@iZt web]# tail -f /data ...

  7. 解决 ”upstream prematurely closed connection while reading response header from upstream“ 问题,运行环境为:ngi

    解决 "upstream prematurely closed connection while reading response header from upstream" 问题 ...

  8. upstream sent too big header while reading response header from upstream

    年底了事情真多,club服务器有问必答 提交页面 提交出这个问题 The page you are looking for is temporarily unavailable.Please try ...

  9. 转:PHP--获取响应头(Response Header)方法

    转:http://blog.sina.com.cn/s/blog_5f54f0be0102uvxu.html PHP--获取响应头(Response Header)方法 方法一: ========== ...

最新文章

  1. Python模块包中__init__.py文件的作用
  2. 金山词霸2012不能在PDF中取词 解决办法
  3. 在MAC下安装一些软件时提示来自身份不明开发者
  4. python leetcode_leetcode 刷题经验,主力 python
  5. 如何合理的规划一次 JVM 性能调优
  6. frp ---- golang编写的内网穿透工具简介
  7. HTML5格式问题,你遇到了吗?
  8. Java对象序列化原理以及Serializable接口
  9. c++万能头文件包含的头文件
  10. android singletask启动模式,android:Activity启动模式之singleTask(一)(示例代码)
  11. CATIA入门学习常见问题(一)
  12. Matlab实现分离变量法求解一维热传导方程的初边值问题
  13. csgo fps不稳定和服务器,CSGO fps不稳定,求FPS 优化设置
  14. 阿里物联网平台的使用
  15. core网络课程整理(core概述及启动讲解)
  16. 树形dp瞎讲+树形dp基础题题解
  17. Adobe带你解锁办会新技能
  18. 标准 BT656 并行 数据结构 详解
  19. 覃卫平java,湖南省职业教“十一五”省级重点建设项目验收通过的项目.doc
  20. Java项目:教师资格证报名系统(java+SpringBoot+vue+maven+mysql+elementui)

热门文章

  1. php文本分割成csv,php将文本文件转换csv输出的方法
  2. java中的後綴表達式_求Java堆栈,将中缀算术表达式转换成后缀表达式。
  3. MySQL数据库序列的作用_MySQL数据库:序列使用
  4. linux应用系统使用率,Linux性能优化实战:系统CPU使用率高,但为啥找不到高的应用(06)...
  5. 华为手机服务器响应,服务器响应优化
  6. 三层交换机能传递路由吗?_华为ensp三层交换机VLAN配置静态路由互通
  7. 《编译原理》实验教学大纲
  8. Asp.Net就业课之三验证控件
  9. Nginx 错误10013: An attempt was made to access a socket in a way forbidden
  10. 记录我对Padding Oracle攻击的分析和思考之抄写