Header 后延迟取消链接

Delay unlink after Header

我正在尝试为登录用户创建一个安全的文档检索系统。

首先,我检查用户是否已登录。如果是,我将文件从服务器上的受保护目录复制到用户当前目录中的 Web 可访问 space。

然后我将它们重定向到文件现在所在的 URL。告诉代码休眠 10 秒,让慢速连接有时间下载文件,然后删除它,这样 link 就不能再被其他人使用。

我的问题是 header 后睡眠功能不工作。我尝试删除 if 语句,这使脚本休眠 10 秒,然后在重定向用户之前取消 link 文件,因此 link 已经损坏。

我正在努力寻找一种方法让脚本休眠 10 秒并在重定向发生后仍然执行代码。

    <?php
if(!isset($_SESSION['id'])){
header("location:../../../");
}
else {
    echo copy('C:\directorypath\test.xls','test.xls');
    if(header("location:../docs/test.xls")){
    sleep("10");
    unlink("test.xls");
    }
}
    ?>

您尝试做的事情实际上不可能用 PHP 做,因为 PHP 是单线程的,并且对每个请求从头到尾执行。这意味着 header 重定向不会完成,直到脚本中的所有代码都完成。这意味着脚本将首先等待,然后删除文件,然后尝试重定向到一个不存在的文件。

相反,我打算采用另一种方法;使用和存储只能使用一次的唯一哈希。

检查用户是否已登录。如果他或她已登录,则生成一个唯一的散列并将其插入数据库,例如INSERT INTO hashes (hash, used) VALUES ($myUniqueHash, 0)。然后将用户重定向到一个 PHP 文件,其中包含请求查询中的哈希值,例如

header("Location: serve_file.php?hash=$myUniqueHash");

此文件将对照包含散列的 table 检查 $_GET['hash'] 的值,并检查 used 的值是否为 0。如果是这种情况,它会将 used 列更新为 1serve the file as a proxy。如果未找到散列,或者如果 used 列的值不是 0,它将 return 一个错误。

这样我们就可以为登录用户提供一次(秘密)文件。