假设我的服务器位于http://www.example.com
然后我将文件file.exe放在根服务器的files目录中,因此通常可以通过在浏览器中输入该文件来下载该文件
http://www.example.com/files/file.exe
假设我有一个php脚本,首先对用户进行身份验证,然后将其重定向到该file.exe下载页面
例如。使用这种方法:
header('Location: http://www.example.com/files/file.exe');
exit(0);
的最佳方式是什么?
1。)阻止未经身份验证的用户通过在上面输入该网址来访问该文件而
2.。)尽管1)PHP脚本仍然能够提供该文件。)因此,经过身份验证的用户应该能够在该位置下载该文件
假设我使用标准LAMP堆栈(我也使用Zend Framework)
答案 0 :(得分:6)
假设文件不是很大,这应该可行:
将文件放在Web服务器文档根目录之外的某个位置,这样任何Web浏览器都无法直接访问它。
如果用户经过身份验证,您的PHP脚本会将文件提供给用户。
请务必使用header()
为该文件发送正确的MIME类型。
如果文件非常大,您可能会遇到一些PHP内存或输出限制。
答案 1 :(得分:2)
0:将文件与数据库中的键匹配。例如。 file.exe = 2fae
1:让用户转到
http://www.example.com/download.php?key=2fae
2/3:检查用户是否有权下载该密钥/文件。
3/2:在数据库中查找,将该密钥与实际文件路径匹配
4:在download.php上,写一下。
header('Content-disposition: attachment; filename='.$actual_file_path_and_name);
header('Content-type: application/exe'); // optional
readfile($filename);
它允许用户下载file.exe而不让他看到file.exe的实际URL。它发生在download.php。
答案 2 :(得分:1)
如果您正在使用Zend Framework,您应该考虑使用框架为您提供的内置解决方案,而不是使用简单的PHP脚本。使用ZF的最佳解决方案是将Zend_Session与Zend_Acl结合使用。因此,您将在会话用户中设置一个值,用于在登录您的网站时描述访问者角色。然后,您可以根据会话中设置的角色,使用Zend_Acl限制对资源的访问。
答案 3 :(得分:1)
我认为在这种情况下使用php代理来访问文件就足够了,其中包括:
<强>的download.php 强>
<?php
/** Load your user assumed $user **/
$file = '/files/file.exe';
if (true === $user->exists()) { //do any other acl checks here
//from http://php.net/manual/en/function.readfile.php
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.$file.'"');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($file);
exit;
} else {
throw new Exception('Download restricted to authorized users only');
}
.htaccess 要拒绝所有直接文件下载,请使用以下内容放在/ files /目录中
deny from all
然后使用/download.php链接到该文件?如果用户已登录,它只会下载该文件
希望有所帮助