Как я могу загрузить доступ к файлам вне каталога public_html?

У меня есть файлы, хранящиеся вне папки public_html в целях безопасности. Тем не менее, я хотел бы как-то связать конкретные файлы, где пользователь мог бы загрузить один из этих файлов.

Я использую сценарий jquery, который позволяет мне указать сервер PATH в качестве папки для загрузки, и он загружается за пределы папки public_html.

Единственная проблема заключается в том, что мне требуется указать URL-адрес «пути загрузки», который используется для загрузки файлов. Я думал, что смогу что-то вроде:

public_html/redirect (contains htaccess which forwards all requests to "hiding" folder) hiding (outside public_html) A user clicks /redirect/file.doc and they download a file located at hiding/file.doc 

Это возможно? Если нет, как я могу предоставить определенный доступ к файлам для скачивания файлов вне моего каталога public_html? Я знаю, что видел это на других сценариях раньше …

Вы можете сделать это с помощью «обработчика загрузки php»:

Вы можете использовать такой метод, чтобы вернуть содержимое файла и заголовки информации о файлах в браузер пользователей, просто убедитесь, что перед этим ничего не выводится.

Я предлагаю вам поместить это в отдельный файл и вызвать его, например download.php .

 function returnFile( $filename ) { // Check if file exists, if it is not here return false: if ( !file_exists( $filename )) return false; header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); // Suggest better filename for browser to use when saving file: header('Content-Disposition: attachment; filename='.basename($filename)); header('Content-Transfer-Encoding: binary'); // Caching headers: header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); // This should be set: header('Content-Length: ' . filesize($filename)); // Clean output buffer without sending it, alternatively you can do ob_end_clean(); to also turn off buffering. ob_clean(); // And flush buffers, don't know actually why but php manual seems recommending it: flush(); // Read file and output it's contents: readfile( $filename ); // You need to exit after that or at least make sure that anything other is not echoed out: exit; } 

Расширение его для базового использования:

 // Added to download.php if (isset($_GET['file'])) { $filename = '/home/username/public_files/'.$_GET['file']; returnFile( $filename ); } 

Предупреждение:

Это основной пример и не учитывает, что пользователь может попытаться воспользоваться некоторыми злобными преимуществами $_GET которые должным образом не дезинфицируются.

Это означает, что в основном пользователь может, например, извлечь файл passwd или другую конфиденциальную информацию, если применяются определенные условия.

Например, извлечение /etc/passwd :

Просто укажите браузер на http://server.com/download.php?file=../../../etc/passwd и сервер вернет этот файл. Поэтому перед реальным использованием вы должны выяснить, как правильно проверять и дезинформировать любые аргументы, предоставленные пользователем.

Это невозможно для путей вне public_html .

mod_rewrite только перезаписывает запрос, но путь все равно должен быть доступен для пользователей.

Другой стандартный способ сделать это – использовать файл mod_xsend – это позволит веб-приложению, чтобы веб-сервер отправил файл в качестве своего вывода, указав путь в заголовке (X-SendFile).