Nginx 的 X-Accel-Redirect(X-Sendfile)
来源:互联网 发布:派尔玻璃优化软件 编辑:程序博客网 时间:2024/05/18 02:29
系统 : Windows XP SP2
服务器 : Nginx
公司出了个网络存储的产品,下载部分起初我是用PHP的readfile函数实现的…
但是网站里存储的文件可能会比较大,那么使用脚本输出文件无疑会增加服务器的负担…
寻觅许久,终于觅得 X-Sendfile ,这个特性 lighthttd 是支持的,apache2 也可以通过增加模块提供支持!
鉴于我本地使用的是Nginx服务器(莫怪我纯粹是为了追逐潮流),所以我找到了一些关于Nginx 这方面的内容,Nginx 也支持X-Sendfile 特性,但是这个特性在Nginx上叫做 X-Accel-Redirect 下面就来谈谈如何配置以及依靠X-Accel-Redirect 特性实现下载.
1.配置
关于Nginx 主机的基本配置这里就不多说了,直接进入正题:
在server 段中配置.
例如你想通过 /download/这个路径来实现下载地址的模拟实际地址 D:/web/filesave/ 下的同名文件下载,你就可以如下配置
location /download/ {
internal;
root /cygdrive/d/web/filesave/;
}
这里的internal 至关重要,后面我们会说到为什么他很重要.所以这里请先注意一下.root 就不用说了 ,后面的路径是文件存放的实际物理地址,/cygdrive/d 实际上指代的是D盘,因为windows 版的Nginx是在cygwin的支持下实现的,cywin 是个很强的Unix模拟工具,同时他为Unix程序能在windows下编译运行停工了,强大的接口!其他的也不多说了!
如果你想通过 /download/这个路径来实现下载地址的模拟实际地址 D:/web/filesave/download/ 下的同名文件下载,你就可以如下配置
location /download/ {
internal;
root /cygdrive/d/web/filesave; <―-注意这里少了一个斜线
}
2.程序调用
程序调用很容易,只要程序输出一个HTML header 就可以了 内容类似如下,比如你要下载服务器中 D:/web/filesave/ 下的 thaiki.exe ,那么你只要使用程序输出以下头信息(以PHP为例):
header('X-Accel-Redirect: /download/thaiki.exe');
你同样可以给下载的文件重命名,或者指定它的文件类型,但是这些不在本文的讨论范围之内.
现在我们来说说上面提到的 internal , internal 顾名思义就是指的 Nginx 的内部处理指令, 引用官方的解释就是"表明 只有内部的请求才能使用的.例如请求返回404错误."而到这里 , 显而易见的是header('X-Accel-Redirect:/download/thaiki.exe');是向服务器提交了一个内部请求,然后Nginx自动将此连接转向到实际的地址.而经过我和头儿使用firefox 的 firedebug 测试,也确实没有捕捉到 X-Accel-Redirect头信息!所以我们只是猜想,可能Nginx在发送数据之前先对数据进行了检验,然后检测到这些信息就自动过滤,提交到内部处理.因为没见过源码,所以也只能说是猜想!不过其实想想也明白了,如果这些头信息被捕捉 一些关键信息暴露 那么这个特性的安全性就会大大折扣!
3.注意事项
在使用时候,你必须要明白以下头信息是不能被Nginx更改的(即这些信息得由你来指定!)
Content-Type
Content-Disposition
Accept-Ranges
Set-Cookie
Cache-Control
Expires
如果其中的一些信息没有指定,那么重定向请求设置!
4.更多处理控制
你可以通过一下头信息来配置 X-Accel-Redirect 特性:
X-Accel-Limit-Rate: 1024
X-Accel-Buffering: yes|no
X-Accel-Charset: utf-8
- Nginx 的 X-Accel-Redirect(X-Sendfile)
- nginx---X-Accel-Redirect(X-Sendfile)
- 给nginx lua模块添加sendfile函数可代替X-Accel-Redirect
- 使用Nginx的X-Accel-Redirect实现大文件下载
- php+nginx做下载服务器配置—X-Accel-Redirect
- 利用Nginx的X-Accel-Redirect头实现下载控制(附带php和rails实例)
- Nginx中的x-sendfile机制
- Apache 的 X-sendfile
- 在nginx中x-sendfile解决方案
- 使用 Nginx 的 X-Sendfile 机制提升 PHP 文件下载性能
- 使用 Nginx 的 X-Sendfile 机制控制文件访问权限(php版)
- 使用Nginx的X-Sendfile机制提升PHP文件下载性能
- php nginx用x-sendfile控制文件下载权限
- Apache,Nginx,Lighttpd分别使用X-sendfile功能提升文件下载性能
- Apache,Nginx,Lighttpd分别使用X-sendfile功能提升文件下载性能
- PHP X-sendfile实现文件下载
- 转:RoR网站如何利用lighttpd的X-sendfile功能提升文件下载性能
- RoR网站如何利用lighttpd的X-sendfile功能提升文件下载性能
- C#自定义事件
- 添加任务计划 执行 网络提交功能总结
- Apache 的 X-sendfile
- 2010年3月15日下午13:30分....
- tftp配置文件
- Nginx 的 X-Accel-Redirect(X-Sendfile)
- PKU 3327City Horizon离散化+线段树
- android event listener and event handler
- linux C库函数与系统调用的区别
- BufferedWriter的好處
- VC编译器限制字符串长度不能超过65535,NND
- JDBC下载安装
- vc_SQLServer----'enum' type redefinition:6错1警(图见 相册一01)
- partial关键字解读~