загрузка файлов с пробелами в имени-ограничение через htaccess

я наткнулся на странный способ защиты файлов.

в основном есть пустая загрузка.php-файл в защищенной папке и два файла, которые вызывают загрузку файла (из той же папки): .htpwd, где хранится пароль и .реврайт:

RewriteEngine On
##RewriteBase /
RewriteCond %{HTTP_REFERER} !^http(s)?://(www.)?example.com [NC]
RewriteRule .(.*)$ - [NC,F,L]

RewriteCond %{QUERY_STRING} ^filename=(.*)$
RewriteRule ^download.php$ %1
RewriteRule (.*) - [E=file:]
Header set Content-type "octet-stream"
Header set Content-disposition "attachment; filename=%{file}e" env=file

##AuthName "Restricted Access" 
##AuthType Basic
##AuthUserFile /local/home/example/example.com/downloads/.htpwd
##AuthGroupFile /dev/null 
##require valid-user

пример ссылки для скачивания:
http://www.example.com/downloads/download.php?filename=dog%20cat%20cow.zip

Если имя файла-собака-кошка-корова.молнии - все работает. Проблема начинается, когда имя: "собаки кошки коровы.молния", то файл будет загружен но его имя файла после загрузки будет " собака "вместо" собака кошка корова".промелькнуть." Так что проблема в том, что люди получают файл без расширения и понятия не имеют, что с ним делать.

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

1 ответов


как упоминалось в комментариях, возможно, попробуйте:

RewriteEngine On
##RewriteBase /
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?example.com [NC]
RewriteRule \.(.*)$ - [NC,F,L]

RewriteCond %{QUERY_STRING} ^filename=(.*)$
RewriteRule ^download\.php$ %1
RewriteRule (.*) - [E=file:]
Header set Content-type "octet-stream"
Header set Content-disposition "attachment; filename='%{file}'" env=file

##AuthName "Restricted Access" 
##AuthType Basic
##AuthUserFile /local/home/example/example.com/downloads/.htpwd
##AuthGroupFile /dev/null 
##require valid-user

альтернативно, почему бы не установить тип контента и расположение в вашем download.php сам файл?

$fileStorageDirectory = '/the/folder/the/downloadable/files/are/in/';

// Check for Parameter
if( !isset( $_GET['filename'] ) || $_GET['filename']=='' ){
  header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found', true, 404);
  die('No File Specified');
}

$fileName = trim( $_GET['filename'] );
$fileRequested = $fileStorageDirectory.$fileName;
// Check File Exists
if( !file_exists( $fileRequested ) ){
  header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found', true, 404);
  die('File Not Found');
}
// Check File is Readable
if( !is_readable( $fileRequested ) ){
  header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found', true, 404);
  die('File Not Accessible');
}
// Send the File
header( 'Content-Type: application/octet-stream' );
header( 'Content-Disposition: attachment; filename="'.fileName.'"' );
readfile( $fileRequested );
exit;