今天突然接到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:目录设置与其类似

相关链接:

http://www.nginx.cn/692.html