Добро пожаловать на сайт <БагБД>, где вы можете задавать вопросы о программировании и разработке на Битрикс и Битрикс24, и получать быстрые и квалифицированные ответы от профессионалов!

Запрет кеширования css и js файлов

00 голосов
3
Есть сайт, на котором периодически меняются css и js файлы. А у пользователей из-за кеширования этих файлов браузером, страницы продолжают отображаться со старыми стилями или появляются глюки в js скриптах. Причем бывает что обновление не происходит по несколько дней.

Есть надежный метод борьбы с таким кешированием, основанный на генерировании рандомного или привязанного к дате изменения имени файла, типа http://URL/function.js?ver=123456, где 123456 берем из filemtime($filename). Но как в этом случае быть с файлами styles.css, template_styles.css и особенно со скриптами и стилями компонентов битрикса, которые подключаются автоматически?

Какие есть идеи?
спросил 02 Дек, 13 от Juliette (320 баллов)

3 Ответы

00 голосов
Разработчикам уже выдвинули такое пожелание, ну а пока можно использовать такие костыли (в /bitrix/php_interface/init.php поместите):
Код
<?
AddEventHandler("main", "OnAfterUserUpdate", array("CMainHandlers", "OnAfterUserUpdateHandler"));

class CMainHandlers
{
   function OnEndBufferContentHandler($content)
   {
      $content = str_replace("template_styles.css", "template_styles.css?v28022010", $content);
   }
}
?>

Ну и функцию допишите на переопределение других стилей, можно по маске. Это как бы идея.
ответил 01 Фев, 14 от Arn4 (2,140 баллов)
00 голосов
Спасибо, только событие не OnAfterUserUpdate, а OnEndBufferContent
ответил 20 Май, 14 от Juliette (320 баллов)
00 голосов
В общем вот такой код теперь использую:

Код
<?
AddEventHandler("main", "OnEndBufferContent", array("CMainHandlers", "OnEndBufferContentHandler")); 

class CMainHandlers 
{
   function OnEndBufferContentHandler($content)
   {
      $reg = '/(?:href|src)="(?!http)(?!\/\/)([^"]+.(?:js|css))"/sim';
      preg_match_all($reg, $content, $arr);
      
      $arr[1] = array_unique($arr[1]);
      
      foreach($arr[1] as $key => $el){
         $fullpath = $_SERVER["DOCUMENT_ROOT"].$el;
         if(file_exists($fullpath) && !strpos($el, "?")){
            $content = str_replace($el, $el."?".filemtime($fullpath), $content);
         }
         
      }
   }
}
?>
ответил 16 Сен, 14 от Juliette (320 баллов)

Похожие вопросы

0 голосов
2 ответов
спросил 17 Март, 14 от MrLonG (200 баллов)
0 голосов
0 ответов
0 голосов
6 ответов
0 голосов
0 ответов
спросил 11 Апр, 14 от Jugoar (480 баллов)
0 голосов
0 ответов
спросил 01 Ноя, 13 от electro (340 баллов)