Nginx下限制文件下载流量的一些细节

DATE: 2016-11-10 / VIEWS: 1706

Nginx下限流的方法如下:
http {
...
limit_conn_zone $binary_remote_addr zone=one:32k;
...
    server {
        ...
        location /Data/Music/ {
        internal;
        limit_conn one 2;
        limit_rate 3k;
        }
        ...
    }
 ...
}


一般来说,直接指向文件下载这种方法即可了,我的项目中,因为文件下载前要做一些统计及是否登录的处理,所以下载地址是index.php?m=music&c=index&a=get_file&id=363这种格式,一直在location /index.php?m=music&c=index&a=get_file&id=(\d+)$ {这里配置不成功。

偶然发现Nginx下X-Accel-Redirect头。简单来说,文件下载做完预处理后,通过X-Accel-Redirect指向到实际的物理地址,再通过location /Data/Music/ { 来配置限速的内容。

最后,通过internal来拒绝外部访问。

php代码:
//检测文件是否存在
if (!is_file('./Data/Music/'.$files)) {  
     $this->msg(0,'下载失败','请求的文件不存在!');
}
$files = '/Data/Music/'.$files;
$file_extension = strtolower(substr(strrchr($files, "."), 1)); //获取文件扩展名 
$outFile = $info['yycode'].'.'.$file_extension;
            
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=" . $outFile);
header("X-Accel-Redirect: ".$files);
exit ();


http://hi.baidu.com/longniao/item/ecfcb575afecdc2ad6a89c68
http://blog.chinaunix.net/uid-8504518-id-2030653.html
http://hi.baidu.com/quqiufeng/item/6795cfbfa3a02a77254b09e2