Эта тема на forum.dklab.ru


Phoebus: Downloader
Задача: нужно создать грамотный менеджер файлов на php.
Рамки, которые ограничивают все на свете:
есть псевдоурл (открытый, public): например, http://site/files/file.ext
Но реально не существует ни папки /files/, ни файла file.ext, а только папка /___hidden/ и файл 012345.ext, не видимые извне.
И еще где-то таблица соотвествий, что files/file.ext === ___hidden/012345.ext
И все бы ничего, проще всего было бы перенаправлять все урлы с помощью Mod_rewrite на скрипт redir.php, который будет обрабатывать REQUEST_URI, искать соответсвие в таблице и далее:
а) отправлять заголовок:
Header ("Location: http://site/___hidden/012345.ext");
б) читать файл, определять mime-type и выводить соответсвующие заголовки и собственно файл
Оба метода никуда не годятся, т.к. в первом случае нам приходится раскрывать реальный путь к файлу, а во втором читать файл целиком, что невозможно при очень большом размере.

Так вот, собсвенно вопрос.
Можно ли реализовать такой алгоритм:
1. Юзер запрашивает http://site/files/file.ext
2. Апач передает это значение скрипту
3. Скрипт находит соответсвие с адресом на реальный файл http://site/___hidden/012345.ext
4. Отдает его (куда? апачу, к примеру)
5. Апач выдает файл http://site/___hidden/012345.ext, даже не говоря пользователю о том, что это другой адрес, а не тот, который он попросил.

Никто не может помочь, что тут можно сделать?..

P.S. Описан план очень по-глупому, но я просто попытался разжевать то, что мне нужно, в реале оно может и по другому работать, главное - результат.
Константин Жинько [tIT]:
Так вот собственно ответ:
используйте mod_rewrite.
Побродите по Поиску на темы:
mod_rewrite, чпу, регулярные выражения, pcre
WingedFox:
Phoebus
Почему плохо отдавать файлы через PHP:
1. Таким образом не сможете реализовать докачку.
Вернее сможете, конечно, но сей труд врядли будет оценен.
2. Получите очень большой расход памяти.

Если есть возможность ставить что-либо своё на сервер, посмотрите в сторону FTP серверов, ибо там всё это уже сделано.
Константин Жинько [tIT]:
WingedFox
Большинство серверов и прирубают докачку... Из исключительной жадности... Или от "авторских прав" бегают.
А насчет памяти -- то это бред...
Есть же в *nix symlink'и.. Берем и создаем от балды symlink на реальный файл и отдаем этот файл апачу.. Через какое-то время прибиваем этот symlink и создаем новый
WingedFox:
tIT
Насчёт бреда - поаккуратней. Посмотрите, что происходит, если отдавать файл через PHP, а не редиректом.

Вариант с символьными ссылками плох кривостью авторизации, буде понадобится.
Константин Жинько [tIT]:
Насчёт бреда - поаккуратней. Посмотрите, что происходит, если отдавать файл через PHP, а не редиректом.
Мозги сжираются по идее... Пересылку через PHP я даже не рассматриваю.

Вариант с символьными ссылками плох кривостью авторизации, буде понадобится.
Гхм... А чем плох-то?
WingedFox:
Пересылку через PHP я даже не рассматриваю.
Задача: нужно создать грамотный менеджер файлов на php.

А чем плох-то?
Покажите, как сделать раздачу прав на символьные ссылки при доступе через веб.
Пользователей и файлов - неограниченное количество.
Владимир Хоменко:
WingedFox

Так ведь нет разницы, знает ли пользователь имя ссылки (а мы можем ее генерить незапоминаемую типа site.ru/oo45odsfu904k.zip) или логин/пароль для доступа.

Он и в первом и во втором случае может раздавать файл направо и налево. Так что я не вижу особенных недостатков в случае с созданием ссылок (только их дествительно нужно прибивать через некоторое время).
Phoebus:
Все дело в том, что нужно скрыть от пользователя реальный путь к файлу, избежав при этом тех недостатков, что присущи тем двум методам - редирект и чтение через PHP.

Может, как-то извращнуться и попробовать Action->AddHandler...
Думаю вот...
Никто больше ничего посоветовать не может?
Константин Жинько [tIT]:
Символические ссылки Unix
Phoebus:
А конкретнее?
bæv:
скрыть от пользователя реальный путь к файлу

Никак понять не могу -- а чем ModRewrite'-то не устраивает?


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

Phoebus:
Итак, эврика! Я нашел решение поставленной задачи.
Вот только оно как-то работает непонятно, вернее – не работает.
Суть заключается в использовании директивы RewriteMap
RewriteMap dflr prg:/file.php
RewriteCond %{REQUEST_FILENAME} !-s
RewriteRule \. ${dflr:$1}

// file.php
<?php

echo "___hidden/012345.ext\n";

?>

Красиво, да не то...
Денвер ругается: "RewriteMap not allowed here"
Что это может значить? Это неполноценность денвера, или такое встречается повсемесно?
В документации сказано, что статус RewriteMap-а - extension. Значит ли это, что под дефолту эту директиву не компилируют?
В общем, что можно тут сделать? Есть ли решение у этой проблемы? (Знатоками Апача!)
Евгений Галашин:
В документации сказано, что статус RewriteMap-а - extension. Значит ли это, что под дефолту эту директиву не компилируют?
Не значит. Вы б чуть выше глаза подняли, когда документацию читали. (-;
Context: server config, virtual host
Определить RewriteMap можно только в httpd.conf
Phoebus:
Определить RewriteMap можно только в httpd.conf
Хорошо... в "Денвере" он отрублен... Тогда вопрос тем, кто повидал много хостеров, или что-то вроде такого... Обычно RewriteMap хостеры разрешают, или нет?
Дмитрий Котеров:
Хорошо... в "Денвере" он отрублен...
Чего-чего?

Обычно RewriteMap хостеры разрешают, или нет?
Что значит - "разрешают" или "не разрешают"?
Править httpd.conf дают только те хостеры, которые предоставляют сервис виртуальных машин (VDS), с root-доступом и т.д. Это стоит дорого.
Phoebus:
Чего-чего?
Вот:
Определить RewriteMap можно только в httpd.conf
Как только я запускаю такую вещь в денвере, он ругается, что, мол, RewriteMap not allowed here.
Константин Жинько [tIT]:
Это стоит дорого
порядка 50 у.е. в месяц

RewriteMap not allowed here.
Может все-таки в .htaccess? %
Phoebus:
Может все-таки в .htaccess? %
Да? Ну и в чем тогда тут проблема?
AddType image/ICO ICO
AddType application/x-httpd-php php
ErrorDocument 404 /sys/index.php?exec=404

RewriteEngine On

# Admin interface
RewriteRule ^admin/$ sys/ADM_main.php [L]
RewriteRule ^admin/(.*)$ sys/ADM_$1 [L]

# Documents
RewriteRule ^(.*[^.])/$ index.php [L]

# Files

RewriteMap dflr prg:/sys/file.php
RewriteRule (.*/.*\..+) ${dflr:$1}
Константин Жинько [tIT]:
http://httpd.apache.org/docs/mod/mod_rewrite.html :


Syntax: RewriteMap MapName MapType:MapSource
Default: not used per default
Context: server config, virtual host
Override: Not applicable
Status: Extension
Module: mod_rewrite.c
Compatibility: Apache 1.2 (partially), Apache 1.3


Откуда следует, что все-таки в httpd.conf
Phoebus:
Откуда следует, что все-таки в httpd.conf
Гениально!
Дмитрий Котеров:

Определить RewriteMap можно только в httpd.conf
Как только я запускаю такую вещь в денвере, он ругается, что, мол, RewriteMap not allowed here.

В httpd.conf надо писать, а не в .htaccess!

порядка 50 у.е. в месяц
Нет, есть значительно дешевле. Правда, там сильные ограничения на трафик (этим вообще славны практически все VDS).
Константин Жинько [tIT]:

RewriteEngine On

# Admin interface
RewriteRule ^admin/$ sys/ADM_main.php [L]
RewriteRule ^admin/(.*)$ sys/ADM_$1 [L]

# Documents
RewriteRule ^(.*[^.])/$ index.php [L]

# Files

RewriteMap dflr prg:/sys/file.php
RewriteRule (.*/.*\..+) ${dflr:$1}

Мои действия:
*) создал виртуальный хост в httpd.conf http://test/
*) в нем прописал следующее безобразие, за исключением того, что в prg:/ указал полный путь, иначе апач его не найдет..
Реакция потрясающая:
вылез красный виндузовый алерт с надписью

f:/home/test/www/sys/file.php
Отказано в доступе


В httpd.conf надо писать, а не в .htaccess
Это мы поняли

Правда, там сильные ограничения на трафик

Я про неограниченный (исходящий)
Phoebus:
В httpd.conf надо писать, а не в .htaccess!
Так мы же это уже давно выяснили!
Просто когда уже вроде со всем определились, tIT вдруг написал:
Может все-таки в .htaccess? %
И оно опять началось сначала.
Константин Жинько [tIT]:
оно опять началось сначала
мда.... такое не заметить %%%
интересно, а кто не дает доступ к файлу-то %
Иван Шумков:
"]Есть же в *nix symlink'и.. Берем и создаем от балды symlink на реальный файл и отдаем этот файл апачу.. Через какое-то время прибиваем этот symlink и создаем новый
Можно подробнее пожалуйста. Какие минусы у этого метода?
Сергей доктор:
Бродя по просторам инета нактнулся на следующий класс на PHP, который вероятно может Вам поможет:
URL http://forall.ru-board.com/webarchive/ndl-0.5.zip

Эта тема на forum.dklab.ru