今天突然接到leader的issue,说超过一个G的大文件,下载不了。于是立马,查配置查资料。结果看到几个陌生名词。
下载大文件:
nginx: X-Accel-Redirect //nginx自带,很方便,尤其和yii框架结合使用,更方便。squid: X-Accelerator-Varyapache: 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都考虑到了。
防盗链:
定义:盗用他人网站的图片或视频链接,将链接放到自己网站,实现增加网站内容的效果。该方法加重他人网站负载,提升自己流量。
两种方式:
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:目录设置与其类似
相关链接:
http://www.nginx.cn/692.html