Кроме удаления файлов из корня, если вы используете apache, вы можете изменить .htaccess
(я уверен, что в Windows-системе есть web.config
эквивалент) , чтобы запретить доступ к определенным файлам напрямую. Если вы добавите этот фрагмент в этот файл, он будет запрещать файлы с расширением .pdf
:
<FilesMatch "\.(pdf)$">
Order Allow,Deny
Deny from all
</FilesMatch>
Оттуда, внутри вашего приложения, вы можете создать какую-то систему для курации ваших PDF-ссылок, поэтому, если вы сохраните реальный путь в базе данных и будете использовать идентификатор в качестве ссылки, похожей на:
http://www.example.com/?file=1
или если вы просто делаете простое сканирование:
<?php
# The folder that the PDFs are in
$dir = __DIR__.'/website/folder/';
# Loop over a scan of the directory (you can also use glob() here)
foreach(scandir($dir) as $file):
# If file, create a link
if(is_file($dir.$file)): ?>
<a href="?action=download&file=<?php echo $file ?>"><?php echo $file ?></a>
<?php
endif;
endforeach;
Затем, если пользователь пытается загрузить с помощью ссылки, вы проверяете, что он в первый раз вошел в систему, и, если они есть, загрузите файл, выполнив скрипт, например, ДО ТОГО, как вы выводите что-либо еще в браузер (включая пробелы) )
<?php
session_start();
# First check that the user is logged in
if(empty($_SESSION['username']))
die('You must be logged in to download this document.');
# Not sure which directory you are currently in, so I will assume root
# I would do basename() here incase the user tries to add in something like:
# ../index.php and tries to download files they are not supposed to
$file = __DIR__.'/website/folder/'.basename($_GET['file']);
if(!is_file($file))
die('File does not exist.');
# Double check that the file is a pdf
elseif(strtolower(pathinfo($file, PATHINFO_EXTENSION)) != 'pdf')
die('File appears to be invalid.');
# Start download headers
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;