Простой(или нет) способ обновить кеш страницы у клиента.

Столкнулся с такой ситуацией: клиент захотел сделать рескин сайта, я всё переверстал, но штука в том, что все картинки закешированы в браузерах у тех, кто уже был на сайте, и если с файлами стилей или яваскриптом я могу сделать style.css?ver=2 с сылкой на стильник, то все картинки во всех шаблонах и чанках так не обновишь.
Погуглив немного я понял, что можно либо шаманить с возвращаемыми хедерами, либо для всех изображений менять урл. Первый вариант не очень, потому что тогда картинки будут вообще всегда заново грузиться, а нам надо только при их реальном изменении. Возможно есть какой-то трюк с Last-modified, но я до него недогуглился.
Тогда я решил сделать простой плагин на событие OnWebPagePrerender, который бы перехватывал страницу перед отправкой пользователю и просто менял все урлы для картинок:
<?php
if ($modx->event->name == 'OnWebPagePrerender') {
    $output = &$modx->resource->_output;
    $output = str_replace('.png',".png?ver=" . $modx->getOption('assets_version'),$output);
    $output = str_replace('.jpg',".jpg?ver=" . $modx->getOption('assets_version'),$output);   
}

Чтоб не лезть в код каждый раз, когда надо сбросить кеш пользователя, сделал системную настройку «assets_version» в которой просто прописал 1 — это так же удобно для того, чтоб добавить версию для стилевых файлов или скриптов:
<link rel="stylesheet" href="css/main.css?ver=[[++assets_version]]" />
Теперь, если какие-то картинки, стили или скрипты были изменены достаточно просто увеличить на единицу значение настройки assets_version.

Я не претендую на супер-чистое исполнение задачи, и я понимаю, что это в какой-то мере может быть и костыль, но в полтретьего ночи лучше ничего не придумалось/нагуглилось.

П.С. Да, я знаю, что стр_реплейс по расширению файла — это плохо, и надо использовать регулярное выражение и preg_replace, но в моём случае сработает и так, так что я не стал заморачиваться, имейте это ввиду.
П.П.С Возможно это всё вообще какая-то дичь, которая будет сильно замедлять отдачу страниц сайта, поэтому, если у вас есть какие-то замечания, или решения лучше, то смело предлагайте их в комментариях.
Антон
06 января 2019, 03:10
modx.pro
11
2 332
+11
Поблагодарить автора Отправить деньги

Комментарии: 7

UDAV
06 января 2019, 10:55
1
0
Почему бы просто не сказать клиенту чтобы он нажал ctrl + shift + r?
Все равно придется менять в настройках каждый раз, а это не удобно.
    Антон
    06 января 2019, 11:06
    +2
    Потому что очень много клиентов с мобилок, там нет ни контрола ни шифта как правило. Да и пользователя вообще не должно заботить как оно там работает, просто должно работать.
    Николай
    06 января 2019, 15:18
    +1
    Хороший способ, спасибо. Сам замучился клиентам объяснять по нескольку раз, каждому, чтобы они кеш обновили.
      Александр Мельник
      06 января 2019, 16:17
      0
      Вполне себе выход. Сам делал нечто подобное, правда только для css /js. В некоторых случаях, на активно меняющихся сайтах вешаю к имени файла просто метку времени, таким образом у пользователя всегда свежий файл.
      У меня несколько вопросов, лишь частично связанные с темой.
      — уже два человека здесь в комментариях написали, что нужно просто сказать клиенту обновить страницу с удалением кеша… А каким образом вы «общаетесь» с клиентами? Ведь modx это фреймворк для создания web сайтов, а клиенты сайта — это миллионы посетителей. Вы наверное имели ввиду не клиентов, а заказчиков? Или я что-то не понимаю…
      — автор, а где вы нашли информацию, о свойстве _output у resource? Я правильно понимаю, что это строка с html всего ресурса? На docs.modx.com поиском ничего подобного найти не могу.
        Антон
        06 января 2019, 20:08
        0
        Если делать метку времени, то это должна быть дата апдейта, например, потому что если делать каждый раз текущую дату, то браузерный кеш вообще не будет работать и всё будет грузиться каждый раз полностью.
        А информация про _output в официальных доках про событие OnWebPagePrerender. Да это полностью срендеренная страница, готовая к отправке пользователю.
          Александр Мельник
          06 января 2019, 20:54
          +1
          Вы правы, я таким образом запрещаю работу браузерному кешу. Как правило это для одного css и для одного js файла. Я искренне завидую тем разработчикам, кто отдав сайт на продакшен, забывает о нем на годы. К сожалению, у нас почти всегда бывает так — ой, мы не предусмотрели вот это… а давай поменяем все местами?… не нравятся мне эти цвета (которые мы согласовали с заказчиком, которые отрисовал дизайнер и сверстал верстальщик) — давай заменим… и так ежедневно… Поэтому на таких проектах — да, я поступаю так.
          Спасибо за наводку на страницу на доках.
        Вася
        07 января 2019, 03:36
        0
        А поисковики индексируют картинки без этих ver=.?
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          7