За последние 24 часа нас посетили 22880 программистов и 1232 робота. Сейчас ищут 780 программистов ...

Фантазии с .htaccess

Тема в разделе "Прочие вопросы по PHP", создана пользователем gugi, 23 авг 2007.

  1. gugi

    gugi Активный пользователь

    С нами с:
    21 авг 2007
    Сообщения:
    28
    Симпатии:
    0
  2. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Код (Text):
    1. ^temp/([a-z0-9]+)/(.+)$ index.php?id=$1&file=$2
     
  3. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    А в документацию глянуть лень ?

    Мне лень за вас всё делать, но примерно так...
    Код (Text):
    1. RewriteEngine on
    2. RewriteRule ^temp/([0-9a-f]+)/([0-9a-z\.\-]+)$ index.php?id=$1&file=$2
     
  4. gugi

    gugi Активный пользователь

    С нами с:
    21 авг 2007
    Сообщения:
    28
    Симпатии:
    0
  5. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Код (Text):
    1. RewriteCond %{REQUEST_FILENAME} !-f
    2. RewriteCond %{REQUEST_FILENAME} !-d
    3. RewriteRule ^/temp/$/$  index.php?id=$1&file=$2
    Может быть и так
     
  6. Angerslave

    Angerslave Guest

    gugi, из какой какую ссылку тебе нужно получить?
     
  7. gugi

    gugi Активный пользователь

    С нами с:
    21 авг 2007
    Сообщения:
    28
    Симпатии:
    0
  8. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    gugi
    Что такое "реальная" и что такое "не реальная" ?
    (какая в браузере и какую должен увидеть сервер)
     
  9. gugi

    gugi Активный пользователь

    С нами с:
    21 авг 2007
    Сообщения:
    28
    Симпатии:
    0
  10. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Т.е ты хочешь замаскировать статическую ссылку под динамическую ? (вот уж не понятно нафига)

    Тогда зачем тебе .htaccess ?
    Сделай на РНР скрипт который в зависимости от параметров URL читал файл. (за одно всякие проверки можно будет туда пихнуть, в плоть до "капчи")
     
  11. Angerslave

    Angerslave Guest

    Да нет, чел как раз и должен думать, что отдаётся через пхп-скрипт, а на самом деле пхп-скрипта нет, просто реврайтом подменяется урл и апач своими силами выдаёт юзеру файл на скачку.
    gugi, правильно я тебя понял?
     
  12. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Я это понял, я не понял что мешает сделать скрипт ? (там 3 строчки надо максимум)
     
  13. gugi

    gugi Активный пользователь

    С нами с:
    21 авг 2007
    Сообщения:
    28
    Симпатии:
    0
    Именно так, именно, Angerslave!
     
  14. gugi

    gugi Активный пользователь

    С нами с:
    21 авг 2007
    Сообщения:
    28
    Симпатии:
    0
    интересно какие 3 строчки?

    видимо так сделать анриал, так как у спецов нет по этому поводу предложений... жаль.
    благодарю за желание помочь, мошт что нить и придумаю.
     
  15. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Код (Text):
    1.  
    2. RewriteRule ^index.php\?id=([a-z0-9]+)&file=(.+)$ /temp/$1/$2
    3. 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
    ...
    На определенной стадии я посмотрю этот файлик, посмотрю и другие :)
     
  16. gugi

    gugi Активный пользователь

    С нами с:
    21 авг 2007
    Сообщения:
    28
    Симпатии:
    0
    Что вы скажите на это...
    папка с именем b0e575dd9925ddacb3fbf28d50a96756 содержит файл .htaccess в котором прописан айпи адрес только данного юзера с айди сессии 0e575dd9925ddacb3fbf28d50a96756, для других доступ закрыт. и на остальных папках тоже доступ закрыт.
     
  17. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Скажу, что любые попытки суть «костыль» и неправилен сам подход.

    Серьезно?
     
  18. lexa

    lexa Активный пользователь

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    gugi,
    PHP:
    1. <?
    2. if (!file_exists($file = 'путь/до/папки/где/файлы/и/на/которую/403/'.$_GET['file']){
    3.     header('HTTP/1.0 404 Not Found');
    4.     exit;
    5. }
    6.  
    7. ////////////////////////////////////////////////////////////////////////////////
    8.  
    9. header('Cache-Control: private');
    10. header('Content-Type: application/octet-stream');
    11. header('Content-Disposition: attachment; filename="'.basename($file).'"');
    12. header('Content-Transfer-Encoding: binary');
    13. header('Accept-Ranges: bytes');
    14.  
    15. ////////////////////////////////////////////////////////////////////////////////
    16.  
    17. if ($range = $_SERVER['HTTP_RANGE']){
    18.     $range = str_replace('bytes=', '', $range);
    19.     $range = str_replace('-', '', $range);
    20.     $size  = filesize($file);
    21.  
    22.     header('HTTP/1.0 206 Partial Content');
    23.     header('Content-Length: '.($size - $range));
    24.     header('Content-Range: bytes '.$range.'-'.($size - 1).'/'.$size);
    25. } else {
    26.     header('HTTP/1.0 200 OK');
    27.     header('Content-Length: '.filesize($file));
    28. }
    29.  
    30. ////////////////////////////////////////////////////////////////////////////////
    31.  
    32. $file = fopen($file, 'rb');
    33. fseek($file, (int)$range);
    34.  
    35. while (!feof($file) and !connection_status()){
    36.     echo fread($file, (1024 * 8));
    37.     flush();
    38.     ob_flush();
    39. }
    40. ?>
    Сунь в файл и направляй на него через 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.
     
  19. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    По-моему проще это организовать через фтп. Адрес файла таким образом тоже на глаз не вычислишь.
     
  20. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    lexa

    а в 18 строке точно должно быть "=" а не "=="?
     
  21. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    DarkElf там идёт присвоение, с последующей проверкой. Неплохо бы ещё и isset добавить:
    PHP:
    1. if (isset($_SERVER['HTTP_RANGE']) && ($range = $_SERVER['HTTP_RANGE'])) {
     
  22. lexa

    lexa Активный пользователь

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    DarkElf, Sergey89 правильно написал: присвоение + проверка.

    Sergey89, я при тесте обычно пользую E_ALL с исключением из набора E_NOTICE и E_PARSE - для публики. Поэтому забиваю на предопределения и проверки ключей.

    P.S. Почему-то ты проигнорировал "неправильное" написание $_GET['file'], а только к $_SERVER['HTTP_RANGE'] придрался. ;)
     
  23. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Код (Text):
    1. if (!file_exists($file = 'путь/до/папки/где/файлы/и/на/которую/403/'.$_GET['file'])
    Скобочка-то пропущена :(
     
  24. gugi

    gugi Активный пользователь

    С нами с:
    21 авг 2007
    Сообщения:
    28
    Симпатии:
    0
    Я сделал чуток проще...
    В общем в рамках сессии создаются переменные с именем md5('<случайный набор символов>'),
    переменная содержит имя файла. Ссылка на файл имеет вид index.php?id=md5('<случайный набор символов>')
    После проверки скрипт отдает нужный файл (при нажатии на ссылку).
     
  25. lexa

    lexa Активный пользователь

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Sergey89, кстати, да :).

    gugi, через редирект что ли? Тогда какой смысл вообще генерировать персональные УРЛы, если доступ на папку открыт?