如何在用户登录时授予下载文件的权限

how to give access for downloading a file when user is logged in

我在子文件夹中有一些 .zip 文件,用户登录后可以下载这些文件。 为了防止未登录的用户下载这些文件(并且知道某个 zip 文件的路径),我在 .htaccess

中使用此代码
<FilesMatch "\.(zip)$">
  Order Allow,Deny
  Deny from all
</FilesMatch>

问题是:如果用户登录,他也被阻止下载文件

如何在登录时授予文件访问权限,在未登录时阻止文件下载?

每个示例 zip 文件存储在:www.mydomain.com/data/downloads/download.zip

通过 PHP 提供文件,您可以使用 PHP 会话检查用户是否已登录。

可以做这样的事情...(显然在用户登录时在会话中设置一些合适的东西):

<?php
    session_start();
    if (isset($_SESSION['loggedin']) && $_SESSION['loggedin'] == true) {
        // or however you get the path
        $yourfile = "/path/to/" . $_GET['file']. ".zip";
    
        $file_name = basename($yourfile);
    
        header("Content-Type: application/zip");
        header("Content-Disposition: attachment; filename=$file_name");
        header("Content-Length: " . filesize($yourfile));
    
        readfile($yourfile);
        exit;
    } else {
        echo "Please log in first.";
    }
?>

显然,您可以将文件名作为查询字符串参数传递,并在 $yourfile 中使用它来提供适当的文件。如果这样做(这是正确的做法),可以在提供文件之前进行一些检查以确保文件存在。

示例用法如下:download.php?file=file1.zip

上面的例子假设你没有使用任何框架(即Laravel、CakePHP等),如果你使用框架,我建议使用会话objects/functions可用。

将文件存储在 webroot 之外也是最佳做法,这样可以确保它们受到保护。但这也适用于您的情况,只需将 $yourfile 设置为 /data/downloads 的绝对路径即可。这样做你不需要 .htaccess 的东西。