За последние 24 часа нас посетили 35539 программистов и 1819 роботов. Сейчас ищут 818 программистов ...

Кеширование файлов в определенной папке

Тема в разделе "Прочие вопросы по PHP", создана пользователем acso, 16 ноя 2015.

  1. acso

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

    С нами с:
    15 апр 2010
    Сообщения:
    150
    Симпатии:
    25
    Адрес:
    Одесса
    Здравствуйте, уважаемые программисты.
    Пишу сайт, который не предполагает кеширование своего содержимого на стороне клиента. За исключением папки /img, в которой хранятся "украшательства" сайта: jpg, gif, png, etc. Прошу подсказать, правильно ли я это реализовал. Или есть другие варианты?
    .htaccess в папке img:
    Код (PHP):
    1. Options +FollowSymLinks
    2. DirectoryIndex index.php
    3. Action throw /img/index.php
    4. <IfModule mod_rewrite.c>
    5.   RewriteEngine on
    6.   RewriteBase /
    7.   RewriteCond %{REQUEST_FILENAME} !-d
    8.   RewriteCond %{REQUEST_FILENAME} !-f
    9.   RewriteRule ^(.+)$ img/index.php?$1
    10. </IfModule> 
    /img/index.php:
    Код (PHP):
    1. <?php
    2.   $par = explode('/', $_SERVER['QUERY_STRING']);
    3.   if ($par[0]) {
    4.     $file = getcwd() . '/' . $par[0];
    5.     if (file_exists($file)) {
    6.       header('Cache-Control: public');
    7.       list($usec, $sec) = explode(' ', microtime());
    8.       $sec += 24 * 60 * 60; // устаревает через 1 день
    9.       $expireDate = gmdate('D, d M Y H:i:s', $sec) . ' GMT';
    10.       header('Expires: $expireDate');
    11.       echo file_get_contents($file);
    12.     }
    13.   }
    14. ?>
    PHP, JavaScript, SQL и другой код пишите внутри тегов
    Код ( (Unknown Language)):
    1. [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ты не проверяешь путь к запрошенному файлу. Ты его строишь, но его можно прислать и вида /../../../../ и тп. и выбраться из твоей папки. К тому же нафига тебе getcwd() если ты точно знаешь, где файлы ДОЛЖНЫ быть.
     
  3. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    И главный вопрос: зачем картинки пыхом отдавать?
     
  4. acso

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

    С нами с:
    15 апр 2010
    Сообщения:
    150
    Симпатии:
    25
    Адрес:
    Одесса
    Пробовал somesite.com/img/../some_file.php - /img/index.php не срабатывает, браузер автоматически переходит на указанный файл в корне. На всякий подправил разбивку строки:
    Код (PHP):
    1. $par = explode('/', str_replace('/..', '', $_SERVER['QUERY_STRING'])); 
    С getcwd() - да, перемудрил, просто взял за основу другой свой скрипт, которым пользуюсь довольно давно. С другой стороны, данный механизм можно перекинуть и на другую папку, особо не правя исходник.
    А "пыхом" (ужас какой) картинки решил отдавать, так как вот таким образом мне привиделась возможность кеширования файлов в конкретной папке. Потому и просил совета у знатоков, кто что лучше может предложить.

    PHP, JavaScript, SQL и другой код пишите внутри тегов
    Код ( (Unknown Language)):
    1. [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
     
  5. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    картинки не надо, а части страницы кешировать можно, да. Я кеширую на файликах и доволен.
     
  6. acso

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

    С нами с:
    15 апр 2010
    Сообщения:
    150
    Симпатии:
    25
    Адрес:
    Одесса
    Коль сказали "а", так и "б" уж говорите. Почему не надо то? Дабы пхп-сервер не нагружать? Ну, я не новый ВКонтакте пишу, особо крупного наплыва посетителей не намечается.
    У меня тут еще одна мысль возникла. Создать поддомен типа i.somesite.com, в панели управления хостингом выставить ему "принудительное" кеширование и все картинки на сайт тянуть через него. Видел, часто так делают. Насколько я понял - именно для этой цели. Что скажете?
     
  7. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    кешировать нужно то, что меняется. Картинки и так уже файлы. Что вообще ты называешь кешировать? Сохранять к себе? Это не называется "кешировать".
     
  8. acso

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

    С нами с:
    15 апр 2010
    Сообщения:
    150
    Симпатии:
    25
    Адрес:
    Одесса
    Кешированием я называю это: страница на вскидку.
    И, кстати, там я нашел ответ на свой вопрос без "костылей" на пхп - под Apache:
    Код (PHP):
    1. <FilesMatch "\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|
    2. gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$"> Header set Cache-Control "max-age=2592000, must-revalidate" </FilesMatch>
    - кеш указанных файлов на один месяц. Думаю, самое то.
    Спасибо за участие.

    PHP, JavaScript, SQL и другой код пишите внутри тегов
    Код ( (Unknown Language)):
    1. [b]php][/b]Тут код[b][/[/b][b]code][/b][/color][size=85][color=green]Добавлено спустя 15 минут 13 секунд:[/color][/size][b]2 denis01[/b]: извините, на других форумах привык просто code в квадратных скобках писать.
    2. Кстати, указанный выше код у меня не заработал, апач вернул ошибку. Вот так получилось:
    3. [code=php]<FilesMatch "\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|
    4. zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$">
    5. ExpiresDefault "access plus 1 month"
    6. </FilesMatch> 
    Между ico| и zip| переноса строки быть не должно.
     
  9. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Вот теперь верно )
     
  10. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    да, это в конфиге веб-сервера делается