Это не вопрос "как сделать?", а вызов на линчевание предлагаемого метода.
Задачка:
Требуется отдавать файлы с сайта с учетом прав одтельных пользователей.
Условия:
Shared-хостинг на Apache с доступным mod_rewrite и PHP.
Очень распостранен такой метод: вместо "прямой" ссылки дается что-то вроде dowload.php?id=7367, а скрипт download.php проверяет права и, если они есть, формирует http-заголовки и отдает файл целиком через readfile() либо частями через echo fread. Метод хорош, но смущает
1) Необходимость самому отрабатывать возможность докачки;
2) На больших файлах скрипт может работать долго, а не факт, что set_time_limit() не закрыт администрацией;
3) Не могу доказать, но сдается мне, что нагрузка на сервер будет выше, чем если бы файл отдавал непосредственно Apache. Повторю - мы на shared-хостинге. Это может оказаться критичным!
Кроме того, испытываю болезненную страсть к прямым ссылкам или выглядящим как "прямые".
Поэтому я предлагаю обсудить ДРУГОЙ метод. Статический файл отдается апачем, но апач должен как-то ограничивать доступ.
Пусть наши тестовые скрипты находятся по адресу http: //test1.ru/fs1/
Шаг 1. Обманка с адресом.
Пусть наши файлы лежат в папке files. Имена файлов не совпадают с именами как они будут выглядеть в адресной строке и сохраняться на диск пользователя.
Не буду вдаваться в подробности почему не хочу хранить файл с первозданным именем. Так надо!
/fs1/.htaccess
RewriteEngine on
RewriteBase /
RewriteRule download/([0-9a-f]+)/([^\.]+)\.([0-9a-z]+) /fs1/files/$1.$3 [L]
Ссылка вида
http: //test1.ru/fs1/download/c7d2/siski-super.gif
будет приводиться к файлу
<DocumentRoot>/fs1/files/c7d2.gif
Чтобы хитрый пользователь не подсмотрел имена реальных файлов, создадим еще один .htaccess
/fs1/files/.htaccess
Options -Indexes
Шаг 2. Наличие авторизации (точнее наличие нужной куки)
Файлы спрятали, теперь надо контролировать доступ для отдельных пользователей.
Ничего революционного. Авторизация пользователей производится на базе куков.
Пусть наш сайт хранит пользовательскую запись в куке с именем login в виде пары
username-password_hash
Здесь неважно каким именно образом формируется этот hash. Мы будем читать куку, брать нужный кусок текста и использовать его.
вторая версия /fs1/.htaccess
RewriteEngine on
RewriteBase /
RewriteRule download/([0-9a-f]+)/([^\.]+)\.([0-9a-z]+) /fs1/files/$1.$3 [L]
RewriteCond %{HTTP_COOKIE} !login=.*
RewriteRule files/.* - [F,L]
Если пользователь неавторизован, то у него нет нужной куки и нет возможности читать файл.
Плохо то, что любая кука с именем login даст ему доступ. Это временно.
Шаг 3. Только правильный пользователь имеет доступ
третья версия /fs1/.htaccess
RewriteEngine on
RewriteBase /
RewriteRule download/([0-9a-f]+)/([^\.]+)\.([0-9a-z]+) /fs1/files/$1.$3 [L]
RewriteCond %{HTTP_COOKIE} !login=.*
RewriteRule files/.* - [F,L]
RewriteCond %{HTTP_COOKIE} login=([a-zA-Z0-9]+)-([a-zA-Z0-9]{4})
RewriteCond /home/test1.ru/www/fs1/access/$1-%2 !-f
RewriteRule files/([0-9a-f]+).([0-9a-z]+) - [F,L]
Отсюда видно, что пользователь получит отлуп, если не будет специального файла в папке access.
Имя этого файла формируется из части авторизационного хеша и имени реального файла.
Для каждой пары файл-пользователь понадобится свой проверочный файлик в access.
Предположим авторизованный пользователь имеет такую запись в куках
john-1e37072609894a67cf903501c3a22d87
и кем-то создан файл access/0fda-1e37
тогда john сможет скачать файл по ссылке
http: //test1.ru/fs1/download/0fda/sometext.txt
Конечно папку access тоже надо закрыть от посторонних глаз!
/fs1/access/.htaccess
Options -Indexes
Order allow,deny
Deny from all
Чтобы не раздувать пост, я ПОКА не привожу текста скриптов, отвечающих за авторизацию и за создание проверочных файлов-маркеров. Надеюсь суть метода уже понятна. Ели нет - спрашивайте.
Прошу приступать к линчеванию.