今天突然接到leader的issue,说超过一个G的大文件,下载不了。于是立马,查配置查资料。结果看到几个陌生名词。
下载大文件:
nginx: X-Accel-Redirect //nginx自带,很方便,尤其和yii框架结合使用,更方便。
squid: X-Accelerator-Vary
apache: X-Sendfile //apache的一个第三方组件,需要安装
lighttpd: X-Sendfile/X-LIGHTTPD-send-file
以上为几个主流的web server ,对于下载,直接文件读取,最吃内存,flush()处理次之,用以上方式,最省内存,吹牛逼点说,是“零内存”消耗。
对于yii框架用户,甚是简单。
1/ 程序里面,判断文件是否存在,用户是否有下载权限。
2/ Yii::app()->request->xSendFile($url,array('forceDownload'=>1,'xHeader'=>'X-Accel-Redirect')); // $url 就是你的文件的相对路径。yii中xSendFile函数封装的相当好,apache 和 lighttpd都考虑到了。
相关链接:
http://www.phpweblog.net/phpbaby/archive/2012/07/10/7709.html
http://wiki.nginx.org/XSendfile
http://www.cnblogs.com/cevin/archive/2012/03/22/2411972.html
防盗链:
定义:盗用他人网站的图片或视频链接,将链接放到自己网站,实现增加网站内容的效果。该方法加重他人网站负载,提升自己流量。
两种方式:
No 1: 原理:通过http协议的头部referer字段,可以检测请求来源,如果referer字段中的url是别人的域名,说明已经被盗用。
location ~* \.(gif|jpg|png|swf|flv)$ {
valid_referers none blocked www.ccvita.com www.phpq.net;
if ($invalid_referer) {
rewrite ^/ http://www.ccvita.com/403.html;
#return 404;
}
}
第一行:gif|jpg|png|swf|flv
表示对gif、jpg、png、swf、flv后缀的文件实行防盗链
第二行:www.ccvita.com www.phpq.net
表示对www.ccvita.com www.phpq.net这2个来路进行判断
if{}里面内容的意思是,如果来路不是指定来路就跳转到错误页面,当然直接返回404也是可以的。
No 2:nginx的一个组件。
推荐使用NginxHttpAccessKeyModule这个东西。
相关链接:
http://www.ccvita.com/312.html
阻止绝对路径获取文件:
web下,有时下载模块处理再好,也难免不被客户端截取到相对路径。再拼接个主机域名,直接访问,资源便不安全了。
还好,apache 和 nginx都有对应的处理。
nginx:目录权限设置
//假如uploads即是我们需要保护的目录,不能让客户端通过拼接直接访问
location /uploads {
internal; //下载正常,但拼接无法打开。因为internal作用使得只能程序内部请求才处理
alias /home/liang/media/uploads; //这边我们重写url,使下载路径指向真实资源路径。
autoindex off;
}
location /uploads { //下载,拼接都无法打开 deny all; }
apache:目录设置与其类似
相关链接:
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:nginx+防盗链+下载大文件+路径直接获取文件 - Python技术站