如何使用.htaccess和登录页保护文件


How to protect files with .htaccess and a login page?

我在服务器上托管了一些我不想公开的文件(如照片、音乐等)。因此,我构建了一个要求OTP的PHP表单,如果代码正确,它就会显示"OK"。禁止访问PHP文件并不难,但我如何才能对任何其他文件类型进行访问?

例如,我希望当用户输入时:

www.example.net/private.png

.htaccess将转到:

www.example.net/access.php

在用户不知情的情况下,比如AJAX。

如果文件返回true,则会向用户显示www.example.net/private.png中的内容。如果它向他返回false,它将向他显示以下URL中的表单:

www.example.net/login.php?url=private.png

成功登录后,PHP会将他重定向到:

www.example.net/private.png

再说一遍。比所有的过程再次,但现在,因为他已经登录,www.example.net/access.php将返回他true

要做到这一点,应该在.htaccess文件中写入什么?

要使用PHP保护文件访问,请将文件放在web无法直接访问的专用目录中。

创建一个允许用户登录的PHP脚本

login.php

<?PHP
session_start();
// { Write your own code to authenticate the user }
echo "<h1>Logged in</h1>";
// set this after user logs in successfully
$_SESSION['access_allowed'] = true;
?>

创建另一个PHP脚本来检查用户是否已登录。如果用户已登录,请从您的私人目录中读取请求的文件并将其推送到浏览器。

guard.php

<?PHP
session_start();
if(!isset($_SESSION['access_allowed'])){
    header("HTTP/1.0 401 Unauthorized"); // or redirect to the login page
    exit;
}
$private_dir = "/home/tester/guarded";
$filename = $private_dir.$_SERVER['PATH_INFO'];
if(!file_exists($filename)) {
    header("HTTP/1.0 404 Not Found");
    exit;
}
// $mime_type = "application/octet-stream";
// Finding MIME type using Fileinfo extension
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime_type = finfo_file($finfo, $filename);
finfo_close($finfo);
header('Content-Type: '.$mime_type);
header('Content-Disposition: inline; filename='.basename($filename));
header('Content-Length: ' . filesize($filename));
readfile($filename);
exit;
?>

当登录的用户请求www.youserver.com/guard.php/image/secret.jpg时,他/她将收到图像文件:/home/tester/guard/images/secretjpg

进一步更改

将其添加到.htaccess文件中(确保在Apache web服务器中启用了mod_rewrite)

.htaccess

RewriteEngine on
RewriteRule ^(video|music|image)/(.*)$ guard.php/$1/$2

如果您的音乐文件位于私人目录中的music目录中,则只有登录的用户才能访问上的song.mp3http://www.yourserver.com/music/song.mp3

可以类似地访问视频和图像。