Отдача файлов (ngix) Принцип и реализация.

Professor

Новичок
Здравствуйте.
Для понимания проблемы, приведу условную задачу.
Допустим, есть сайт, причем на нем пользователи могут создавать фото галереи. Галереи могут быть закрытыми и открытыми для просмотра.

При скачивании фотографии хочется что бы она отдавалась nginx-ом.
И так какие проблемы мы тут видим.
1) Запрет/разрешение на скачивание картинки из галереи при условии ее открытости/закрытости.
По этому вопросу нашел статью http://habrahabr.ru/blogs/webdev/37686/

2) Первое решение порождает новую проблему, как выводить картинку для просмотра на сайте? Ведь прямой доступ ка картинке должен быть закрыт.

Может посоветуете что нибудь другое? Выслушаю все варианты решения данной задачи.
 

Вурдалак

Продвинутый новичок
По той ссылке, что ты привёл, есть заветный «X-Accel-Redirect». С помощью него и отдавать.
 

Professor

Новичок
Ну дык там я буду проверять права доступа к этому файлу, а это как минимум 1 SQL запрос.
А в галерее куча файлов, которые показываются разом. А если не проверять, то любой может скачать файл
 

Professor

Новичок
Хранить часто меняющиеся права доступа в чем то другом? Тем более ,тут я для простоты опустил возможность доступа к галерее определенных пользователей.
Ладно, спасибо. Буду искать другой подход.
 

confguru

ExAdmin
Команда форума
Не вижу проблем - nginx умеет работать с memcached - храни ссылки на открытые или закрытые галереи в мемкеше.
Если извратиться можно даже php не дергать...
 

Professor

Новичок
хм, memcached? чет я не подумал. Спасибо.

P.S. я в название темы опечатался, поправьте если возможно. ngix=>nginx
 

Вурдалак

Продвинутый новичок
Professor, есть же кеш, сессии. Инвалидацию этих прав сделать тоже не проблема.
 

MiksIr

miksir@home:~$
А какая связь между доступом к картинке и отображением превьюхи на странице? У тебя при генерации страницы вся информация есть - зачем тебе выводить это закрытое фото?
 

Professor

Новичок
на тот случай если пользователь вручную наберет URL который может привести к выгрузке данного рисунка.
 

confguru

ExAdmin
Команда форума
Самое простое решение которые мы в свое время применяли на photofile.ru - закрытый альбомы перемещались в специальныю папку...
100% гарантия что они не отдадутся :)
 

MiksIr

miksir@home:~$
на тот случай если пользователь вручную наберет URL который может привести к выгрузке данного рисунка.
Ну и? Рисуешь страницу где много фотографий - выводишь только доступные фото, т.е. никаких дополнительных проверок по урлу нет.
А проверка на прямой запрос по урлу - это отдельно, она тоже нужна... но вызывается реально часто только если это фото залинковано вне вашего сайта.
 

Вурдалак

Продвинутый новичок
MiksIr, не тупи, он и спрашивает про прямой запрос к картинке. Запрос же к картинке через страницу или напрямую технически ничем не отличается.
 

MiksIr

miksir@home:~$
Технически отличается тем, что запроса к картинке со своей страницы можно вообще избежать.
А кто там что имел ввиду - мы уж сами, спасибо. Там были и сообщения вида "А в галерее куча файлов, которые показываются разом.", если уж совсем не тупить, ага.
 

Вурдалак

Продвинутый новичок
MiksIr, смени тон, а? Имеется в виду, что браузер будет делать запрос к каждой картинке, ссылка на которую дана в этой сформированной странице специально для данного пользователя. Следовательно потребуется так и так делать проверку, т.к. сервер понятия не имеет каким путём пользователь получил ссылку на эту картинку.

Технически отличается тем, что запроса к картинке со своей страницы можно вообще избежать.
— чушь. Он как раз будет.
 

Professor

Новичок
Технически отличается тем, что запроса к картинке со своей страницы можно вообще избежать.
И как путь к картинке будет выглядеть со страницы?
Примерно так? /public/galery/10/images.jpg

А если пользователь наберет в браузере site.ru/public/galery/10/images.jpg ?
 

MiksIr

miksir@home:~$
MiksIr, смени тон, а?
Первый начал, да?
Имеется в виду, что браузер будет делать запрос к каждой картинке, ссылка на которую дана в этой сформированной странице специально для данного пользователя. Следовательно потребуется так и так делать проверку, т.к. сервер понятия не имеет каким путём пользователь получил ссылку на эту картинку.
А, ну это банально. Ключ-валидатор в URL который проверяется на соответствие сессии клиента и имеет короткое время жизни.
 

MiksIr

miksir@home:~$
Разные вещи. Вообще не нужно никакие запросы никуда слать - токен в урле сам себе подпись.

Для nginx есть http://wiki.nginx.org/NginxHttpSecureDownload и не так давно Игорь обещал передать secure_link на поддержку временных токенов, не знаю на какой стадии это - можно спросить.
 
Сверху