добрый день! Хочу сделать ссылки на файлы с помощью .htaccess в виде: http://host.com/index.php?id=b0e575dd99 ... e=smtp.zip из имеющейся: http://host.com/temp/b0e575dd9925ddacb3 ... 6/smtp.zip Подскажите пожалуйста как это можно сделать или привидите пример? Возможно ли это вообще?
А в документацию глянуть лень ? Мне лень за вас всё делать, но примерно так... Код (Text): RewriteEngine on RewriteRule ^temp/([0-9a-f]+)/([0-9a-z\.\-]+)$ index.php?id=$1&file=$2
Создал файлик в корне сайта, перехожу по ссылке: http://host.com/index.php?id=b0e575dd99 ... e=smtp.zip файл не загружается....
Код (Text): RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^/temp/$/$ index.php?id=$1&file=$2 Может быть и так
из этой(реальной) http://host.com/temp/b0e575dd9925ddacb3 ... 6/smtp.zip вот такого плана: http://host.com/index.php?id=b0e575dd99 ... e=smtp.zip
gugi Что такое "реальная" и что такое "не реальная" ? (какая в браузере и какую должен увидеть сервер)
в браузере: http://host.com/index.php?id=b0e575dd99 ... e=smtp.zip сервер видит: http://host.com/temp/b0e575dd9925ddacb3 ... 6/smtp.zip
Т.е ты хочешь замаскировать статическую ссылку под динамическую ? (вот уж не понятно нафига) Тогда зачем тебе .htaccess ? Сделай на РНР скрипт который в зависимости от параметров URL читал файл. (за одно всякие проверки можно будет туда пихнуть, в плоть до "капчи")
Да нет, чел как раз и должен думать, что отдаётся через пхп-скрипт, а на самом деле пхп-скрипта нет, просто реврайтом подменяется урл и апач своими силами выдаёт юзеру файл на скачку. gugi, правильно я тебя понял?
интересно какие 3 строчки? видимо так сделать анриал, так как у спецов нет по этому поводу предложений... жаль. благодарю за желание помочь, мошт что нить и придумаю.
Код (Text): RewriteRule ^index.php\?id=([a-z0-9]+)&file=(.+)$ /temp/$1/$2 RewriteRule ^index.php\?file=(.+?)&id=([a-z0-9]+)$ /temp/$2/$1 Теперь почему так делать не стоит: 1. index.php?id=b0e575dd9925ddacb3fbf28d50a96756&file=../etc/passwd 2. index.php?id=b0e575dd9925ddacb3fbf28d50a96756&file=../../etc/passwd 3. index.php?id=b0e575dd9925ddacb3fbf28d50a96756&file=../../../etc/passwd ... На определенной стадии я посмотрю этот файлик, посмотрю и другие
Что вы скажите на это... папка с именем b0e575dd9925ddacb3fbf28d50a96756 содержит файл .htaccess в котором прописан айпи адрес только данного юзера с айди сессии 0e575dd9925ddacb3fbf28d50a96756, для других доступ закрыт. и на остальных папках тоже доступ закрыт.
gugi, PHP: <? if (!file_exists($file = 'путь/до/папки/где/файлы/и/на/которую/403/'.$_GET['file']){ header('HTTP/1.0 404 Not Found'); exit; } //////////////////////////////////////////////////////////////////////////////// set_time_limit(0); header('Cache-Control: private'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="'.basename($file).'"'); header('Content-Transfer-Encoding: binary'); header('Accept-Ranges: bytes'); //////////////////////////////////////////////////////////////////////////////// if ($range = $_SERVER['HTTP_RANGE']){ $range = str_replace('bytes=', '', $range); $range = str_replace('-', '', $range); $size = filesize($file); header('HTTP/1.0 206 Partial Content'); header('Content-Length: '.($size - $range)); header('Content-Range: bytes '.$range.'-'.($size - 1).'/'.$size); } else { header('HTTP/1.0 200 OK'); header('Content-Length: '.filesize($file)); } //////////////////////////////////////////////////////////////////////////////// $file = fopen($file, 'rb'); fseek($file, (int)$range); while (!feof($file) and !connection_status()){ echo fread($file, (1024 * 8)); flush(); ob_flush(); } ?> Сунь в файл и направляй на него через mod_rewrite. Можешь сделать проверку на свой id. Думаю, правильный вариант это завести табицу с полями id (где хранить чё-то такое оригинальное пущеное через md5(), вроде ip + микросекунды), date (в которой указать до какого момента id жить) и ip (где хранить ip кому выдана ссылка или подсеть с которой можно качать - второе самое оно, потому что бывает дисконект). Ковыряй. Идеи даны, даже код готовый выложил. Не надейся что за тебя всё напишут потому что тебе лень или не умеешь. Если лень - сам виноват, а если не умеешь, то надо учиться. Жестокий мир, жестокие сердца. З.Ы. Для готового есть специальные катологи как то phpclasses.org или woweb.ru. З.З.Ы. $_SERVER['HTTP_RANGE'] и "HTTP/1.0 206 Partial Content" это для докачки. Первое - получаем заголовок от браузера, браузер говорит "я хочу докачку с такого-то куска"; второе - отдаём заголовок, говорим, что "оки, мы поддерживаем докачку". "Cache-Control: private" потому что, как говорят, сам не уверен, при public может сглючить IE.
DarkElf там идёт присвоение, с последующей проверкой. Неплохо бы ещё и isset добавить: PHP: if (isset($_SERVER['HTTP_RANGE']) && ($range = $_SERVER['HTTP_RANGE'])) {
DarkElf, Sergey89 правильно написал: присвоение + проверка. Sergey89, я при тесте обычно пользую E_ALL с исключением из набора E_NOTICE и E_PARSE - для публики. Поэтому забиваю на предопределения и проверки ключей. P.S. Почему-то ты проигнорировал "неправильное" написание $_GET['file'], а только к $_SERVER['HTTP_RANGE'] придрался.
Код (Text): if (!file_exists($file = 'путь/до/папки/где/файлы/и/на/которую/403/'.$_GET['file']) Скобочка-то пропущена
Я сделал чуток проще... В общем в рамках сессии создаются переменные с именем md5('<случайный набор символов>'), переменная содержит имя файла. Ссылка на файл имеет вид index.php?id=md5('<случайный набор символов>') После проверки скрипт отдает нужный файл (при нажатии на ссылку).
Sergey89, кстати, да . gugi, через редирект что ли? Тогда какой смысл вообще генерировать персональные УРЛы, если доступ на папку открыт?