欢迎光临 - 我的站长站,本站所有资源仅供学习与参考,禁止用于商业用途或从事违法行为!

服务器配置

Nginx+X-Accel大文件下载统计、权限判断、速度限制功能

服务器配置 我的站长站 2023-11-10 共70人阅读

实现逻辑

启用nginx的X-Accel

用户访问PHP脚本

各种过滤、统计

php使用header("X-Accel-Redirect:  /file/$fileName");唤起nginx

nginx接力提供文件传输

详细步骤

1、Nginx配置某个站点,在server {}里面添加:

location /xyz {
    internal;
    alias /var/www/myfiles;
}

其中别名xyz可以自定义,到时php脚本需要用一样的别名;

alias是这个别名指向的本地文件夹

2、重启nginx

3、创建php下载脚本 http://xxxx.com/download.php

<?php
 
 
    // 机制配置(仅限当前站点)
    $nginx_x_accel_key = 'xyz';
 
 
    // 获取下载文件的相对路径
    if (!isset($_GET['path'])) {
        die('缺少参数path');
    }
 
    $file_path = $_GET['path'];         // 相对路径,从nginx的internal的自定义别名xyz的路径开始
    $file_name = $file_path;            // 文件名
 
    if (stripos($file_path, '\\') !== false) {
        $parts = explode('\\', $file_path);
        $file_name = array_pop($parts);
    }
    if (stripos($file_path, '/') !== false) {
        $parts = explode('/', $file_path);
        $file_name = array_pop($parts);
    }
    
 
 
    // 下载统计
    $theData = array(
        'access_time'    => time(),                         // 时间戳
        'access_date'    => date("Y-m-d H:i:s", time()),    // 日期
        'access_url'    => $_SERVER['REQUEST_URI'],         // 当前访问网址
        'referer_url'    => $_SERVER['HTTP_REFERER'],       // HTTP来源地址(可伪造)
        'ip_address'    => $_SERVER['REMOTE_ADDR']          // 客户IP地址
    );
 
    //print_r($theData);die();
    // Array
    // (
    //     [access_time] => 1659420862
    //     [access_date] => 2022-08-02 06:16:50
    //     [access_url] => /download.php?path=/onedir/shop.apk
    //     [referer_url] => http://suibian.com/
    //     [ip_address] => 180.149.130.16
    // )
 
 
    // 各种过滤
    // ...  ip黑名单
    // ...  referer域名限制
    // ...  同IP一小时以内的下载次数 ...
    // ...  
 
 
    // 各种统计操作
    // ...
    // ...
 
 
    // 是否使用Nginx缓存,默认yes
    header("X-Accel-Buffering", "yes");
 
    // 下载限速 - 字节 -   1024 字节 = 1 千字节(KB)
    header("X-Accel-Limit-Rate", 1024*1024);
 
    // 逻辑处理完毕,允许下载 --- 记得header前不要有任何的输出!
    header('Content-type: application/octet-stream');
    header("Content-Disposition: attachment; filename=" . $file_name);
    header("X-Accel-Redirect: " . "/{$nginx_x_accel_key}/" . $file_path);

4、访问一下即可下载,可以修改php脚本进行下载统计、各种过滤,限速等限制


相关专题
nginx
nginx
2022-11-28 19

Nginx是一个高性能的HTTP和反向代理web服务器,也是站长常见的网站环境之一.nginx凭借高性能低消耗近几年越来越多站长使用,学习好nginx也成为站长必备知识点.我的...

相关推荐
  • X-Accel
  • 大文件下载
  • Nginx + X-Accel大文件下载示例代码

    Nginx + X-Accel大文件下载示例代码,做个记录以后会用到。// 启用 nginx X-Accel 下载 header(&#39;Content-Type: application/octet-stream&#39;); $encoded_fname = &#39;附件名称&#39;; header(&#39;Content-Disposition: a...

    php教程 28 1年前
  • Nginx+X-Accel大文件下载统计、权限判断、速度限制功能

    实现逻辑启用nginx的x-accel用户访问php脚本各种过滤、统计php使用header("X-Accel-Redirect: /file/$fileName");唤起nginxnginx接力提供文件传输详细步骤1、Nginx配置某个站点,在server {}里面添加:location /xyz { internal; alias /var/www...

    服务器配置 70 11个月前
  • 完整的X-Accel-Redirect限速下载大文件方案

    前言网上搜索X-Accel-Redirect限速下载都是千篇一律的教程,如果按照网上的教程开发,下载大文件时,我的站长站测试还是下载一半会失败。我的站长站研究了很久,发现网上的分享的代码,缺少很多参数,整理分享一篇完整的X-Accel-Redirect大文件下载方案。准备工...

    php教程 107 1年前
  • php大文件下载超时中断解决方法

    <?php //设置脚本的最大执行时间,设置为0则无时间限制set_time_limit(0);ini_set(&#39;max_execution_time&#39;, &#39;0&#39;); $file_name = &#39;aa.zip&#39;; //本机文件地址$extension = pathinfo($file_name)[&#39;extension&#39;];$dowloa...

    php教程 60 1年前
  • 大文件分片上传 / 下载限速解决方案

    分片上传将需要上传的文件按照一定的分割规则,分割成相同大小的数据块;初始化一个分片上传任务,返回本次分片上传唯一标识;按照一定的策略(串行或并行)发送各个分片数据块;发送完成后,服务端根据判断数据上传是否完整,如果完整,则进行数据块合成得到原始文件。...

    php教程 51 1年前
  • Nginx + X-Accel大文件下载示例代码

    Nginx + X-Accel大文件下载示例代码,做个记录以后会用到。// 启用 nginx X-Accel 下载 header(&#39;Content-Type: application/octet-stream&#39;); $encoded_fname = &#39;附件名称&#39;; header(&#39;Content-Disposition: a...

    php教程 28 1年前
  • PHP大文件限速下载功能示例代码分享

    PHP在开发大文件下载功能中,推荐使用文件分段下载,避免文件过大,下载失败或文件损坏。大文件限速下载PHP代码<?php//设置文件最长执行时间set_time_limit(0);if (isset($_GET[&#39;filename&#39;]) && !empty($_GET[&#39;filename&#39;])) { $file_nam...

    php教程 46 1年前
  • phpreadfile下载大文件失败解决方法

    phpreadfile下载大文件失败解决方法,原因是PHP内存有限制,需要改为按块下载,就是把大文件切块后逐块下载。if (file_exists($file)){ if (FALSE!== ($handler = fopen($file, &#39;r&#39;))) { header(&#39;Content-Description: File Transfer&#3...

    php教程 62 1年前