Разрешить скриптам читать файл, но не позволять пользователям напрямую просматривать файл
Скажем, у меня есть текстовый файл example.txt
, и у меня есть PHP скрипт на моем веб-сервере readfile.php
.
То, что я хочу сделать, - это запретить пользователям вводить текст http://www.example.com/example.txt
и напрямую смотреть на текстовый файл, но я все же хочу, чтобы люди могли загружать http://www.example.com/readfile.php
, который читает из файла example.txt
и делает что-то с ним (возможно, отображает содержимое файла).
Кроме того, если это можно сделать, что это лучший способ сделать это?
Ответы
Ответ 1
Да, это легко сделать.
Существует два основных способа запретить пользователям доступ к example.txt
. Первый заключается в том, чтобы поместить его в папку вне вашей веб-папки (обычно называемую www
или public_html
), вторая - разместить файл .htaccess
в папке с вашим example.txt script, который блокирует доступ к файл вообще. .htaccess
будет выглядеть как
<files "example.txt">
deny from all
</files>
Но вы можете изменить example.txt
на нечто вроде *.txt
, если вы хотите заблокировать все файлы .txt
в папке.
Затем вы можете использовать file_get_contents()
в своем readfile.php
, чтобы получить содержимое текстового файла, или если вы просто хотите вывести файл, который вы можете использовать readfile
Ответ 2
Просто сохраните файлы, которые вы не хотите публично доступным вне веб-сайта.
/home
example.txt
/www
readfile.php
Если /home/www/
является вашей общедоступной папкой webroot, любой файл над ней недоступен через веб-сервер. readfile.php
может все равно получить доступ к файлу в ../example.txt
.
Ответ 3
Если вам нужно сохранить файлы в веб-роуте, поместите файлы в папку и запретите доступ к этой папке. Если вы используете apache, создайте файл .htaccess в папке и введите deny from all
Ответ 4
Я сделал нечто подобное, когда файлы содержат чрезвычайно важную информацию, и я хочу, чтобы только проверенные пользователи могли получить файл через HTTPS-соединение.
Я сделал это:
Я помещаю файлы в путь к каталогу, который выходит за рамки того, что может видеть веб-сервер (Apache, для меня). Поэтому нет возможных URL-адресов, которые приведут к тому, что файл будет передан непосредственно веб-сервером. Затем я создал script, который позволяет пользователям войти в систему, щелкнуть по нужному файлу, а затем PHP скрипт считывает файл, помещает соответствующие заголовки, а затем передает файл на компьютер пользователя.
Конечно, script, который показывает пользователю список файлов и script, который передает файл пользователю, должен иметь как минимум доступ для чтения к файлам на пути, где они хранятся.
Удачи!
Ответ 5
Вы можете поместить файл "example.txt" за пределы общей папки и прочитать из readfile.php, например $content = file_get_contents("../example.txt");
Ответ 6
Вы можете вызвать файл, подобный этому, и люди не видят имя файла:
<?php
$file = 'example.txt';
if (file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($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;
}
?>
(источник: php.net)
Будет ли это работать для вас?