我有一个网站,您可以从中下载资源。
我想要的是禁用存储项目的文件夹的公共访问权限,但允许网站访问它们以供下载。
我已经在.htaccess中使用了Order deny,allow
,但如果我使用它,我就无法从网站上下载。
它会给我错误404与尝试为文件键入直接URL相同。下载已完成。
我有以下代码:
$link = $item->link;
$link_headers = get_headers($link);
//Headers
if(isset($link_headers[0]))
{
header($link_headers[0]);
}//if exists
if(isset($link_headers[1]))
{
header($link_headers[1]);
}//if exists
if(isset($link_headers[2]))
{
header($link_headers[2]);
}//if exists
if(isset($link_headers[3]))
{
header($link_headers[3]);
}//if exists
if(isset($link_headers[4]))
{
header($link_headers[4]);
}//if exists
if(isset($link_headers[5]))
{
header($link_headers[5]);
}//if exists
if(isset($link_headers[6]))
{
header($link_headers[6]);
}//if exists
if(isset($link_headers[7]))
{
header($link_headers[7]);
}//if exists
if(isset($link_headers[8]))
{
header($link_headers[8]);
}//if exists
readfile($link);
exit;
事情是,如果我把.htaccess拒绝全部放入包含所有下载项目的文件夹,那么下载将不再起作用,因为我没有获得许可,我希望只有那些尝试的人才能使用从url直接链接到该文件。
答案 0 :(得分:0)
如果保护文件和文件路径,则可以使用download.php文件。
download.php文件内容
<?php
// Connect to db and get file information from db.
// $db_filename and $db_filetype getting from db
header("Content-disposition: attachment; filename=def.file_type"); // def.pdf
header("Content-type: " . $db_filetype); // application/pdf
readfile("/path/of/your/files/".$db_filename); // /project/home/downloads/abc.pdf
用法:
download.php?file_id=1
此用法是保护您的文件夹和文件名,但它使用数据库。
答案 1 :(得分:0)
实现此目的的一种方法是通过检查http-referrer的脚本下载。标题当然可以手动修改,但我认为做一些比这更复杂的事情是一种过度杀伤力:
/*
Change your download links to point to a php script, or use .htaccess to rewrite downloads to the same file
*/
<a href="download.php?file=somefile.zip">Download</a>
//download.php
if ($_SERVER['HTTP_REFERER'] == "your_downloads_page.html") {
$file = $_GET['file'];
if (file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
readfile($file);
exit;
}
}
但请确保添加一些安全检查,以便用户无法下载他们不应该被允许的文件。也许过滤所有斜线和双点。