Как через скрипт выдавать какой-либо файл не давая прямой ссылки?

  • Автор темы Guest111
  • Дата начала

Guest111

Guest
Как через скрипт выдавать какой-либо файл не давая прямой ссылки?

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

Silex

unitecsys
Ну если цель стоит только отследить кол-во скачиваний, и информация не является закрытой (т.е., к примеру, файлы не за деньги качаются), то проще всего организовать соответствие имени (пути) файла какому-либо идентификатору, в ссылке указывать скрипт с этим идентификатором в качестве гет-параметра, по нему определять файл и перенаправлять на него.

В качестве хранилища может быть файл, БД, массив в самом скрипте - смотри по обстоятельствам. Еще более простой вариант, вообще без хранилища: кодировать сам путь к файлу и уже его передавать в качестве параметра, а скрипт будет его раскодировать, никуда не обращаясь. Но это несколько неудобно в плане формирования ссылок...
 

Guest111

Guest
но ведь загрузка будет идти напрямую через скрипт? а это нагрузка на сервер - нежелательно.

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

Demiurg

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

Silex

unitecsys
Далась тебе "загрузка напрямую"...

Когда ты каким-либо образом определил, какой именно файл запрашивается, и получил его URL, в скрите пишешь

header('Location: '.$url);
exit;

где $url - собственно, URL. После этих строк браузер запрашивает указанный URL, а промежуточный скрипт прекращает выполняться.

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

Если же файлы продаются, они по определению не должны быть доступны для всех и должны храниться либо выше корневой директории веб-сервера, либо в защищенных директориях (например, при помощи директив в .htaccess). Отдавать такие файлы пользователю нужно ТОЛЬКО через скрипт, при этом есть много нюансов с докачкой, заголовками файлов и авторизацией, узнать о которых можно, воспользовавшись поиском :)
 

Guest111

Guest
кстати, а если через ЧПУ (mod_rewrite) сервер сильно поднапрягать будет?
 

Silex

unitecsys
кстати, а если через ЧПУ (mod_rewrite) сервер сильно поднапрягать будет?
Каким образом? Алгоритм в студию!

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

Guest111

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

кстати, а как примерно организуется система докачки файла?
как узнать где пользователя дисконнектило например? разве это возможно вообще?
 

Silex

unitecsys
Поищи по форуму. Механизмы выдачи файлов авторизованным пользователям и докачки при этом обсуждались неоднократно и плодотворно.
 

Guest111

Guest
Silex
спасибо за совет только что посмотрел что там по докачкам.. но так и не понял, как узнать, что пользователя выкинуло из сети и на каком байте у него прервалась связь?
там тоже на подобный вопрос ответа так и не смог найти
 

nerezus

Вселенский отказник
докачка:
Range: bytes=[от]-
если такое тебе в запросе передали, то начинай с этого байта передавать файл

и еще: когда файл выводишь, не забудь Content-Range: bytes [от]-[до]/[всего] передавать ;)
и Content-Length: [всего-от] тоже :)
 
Сверху