我在服务器上托管了一些我不想公开的文件(如照片、音乐等)。因此,我构建了一个要求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
可以类似地访问视频和图像。