Простой(или нет) способ обновить кеш страницы у клиента.
Столкнулся с такой ситуацией: клиент захотел сделать рескин сайта, я всё переверстал, но штука в том, что все картинки закешированы в браузерах у тех, кто уже был на сайте, и если с файлами стилей или яваскриптом я могу сделать style.css?ver=2 с сылкой на стильник, то все картинки во всех шаблонах и чанках так не обновишь.
Погуглив немного я понял, что можно либо шаманить с возвращаемыми хедерами, либо для всех изображений менять урл. Первый вариант не очень, потому что тогда картинки будут вообще всегда заново грузиться, а нам надо только при их реальном изменении. Возможно есть какой-то трюк с Last-modified, но я до него недогуглился.
Тогда я решил сделать простой плагин на событие OnWebPagePrerender, который бы перехватывал страницу перед отправкой пользователю и просто менял все урлы для картинок:
Чтоб не лезть в код каждый раз, когда надо сбросить кеш пользователя, сделал системную настройку «assets_version» в которой просто прописал 1 — это так же удобно для того, чтоб добавить версию для стилевых файлов или скриптов:
Я не претендую на супер-чистое исполнение задачи, и я понимаю, что это в какой-то мере может быть и костыль, но в полтретьего ночи лучше ничего не придумалось/нагуглилось.
П.С. Да, я знаю, что стр_реплейс по расширению файла — это плохо, и надо использовать регулярное выражение и preg_replace, но в моём случае сработает и так, так что я не стал заморачиваться, имейте это ввиду.
П.П.С Возможно это всё вообще какая-то дичь, которая будет сильно замедлять отдачу страниц сайта, поэтому, если у вас есть какие-то замечания, или решения лучше, то смело предлагайте их в комментариях.
Погуглив немного я понял, что можно либо шаманить с возвращаемыми хедерами, либо для всех изображений менять урл. Первый вариант не очень, потому что тогда картинки будут вообще всегда заново грузиться, а нам надо только при их реальном изменении. Возможно есть какой-то трюк с 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, но в моём случае сработает и так, так что я не стал заморачиваться, имейте это ввиду.
П.П.С Возможно это всё вообще какая-то дичь, которая будет сильно замедлять отдачу страниц сайта, поэтому, если у вас есть какие-то замечания, или решения лучше, то смело предлагайте их в комментариях.
Комментарии: 7
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Все равно придется менять в настройках каждый раз, а это не удобно.
У меня несколько вопросов, лишь частично связанные с темой.
— уже два человека здесь в комментариях написали, что нужно просто сказать клиенту обновить страницу с удалением кеша… А каким образом вы «общаетесь» с клиентами? Ведь modx это фреймворк для создания web сайтов, а клиенты сайта — это миллионы посетителей. Вы наверное имели ввиду не клиентов, а заказчиков? Или я что-то не понимаю…
— автор, а где вы нашли информацию, о свойстве _output у resource? Я правильно понимаю, что это строка с html всего ресурса? На docs.modx.com поиском ничего подобного найти не могу.
А информация про _output в официальных доках про событие OnWebPagePrerender. Да это полностью срендеренная страница, готовая к отправке пользователю.
Спасибо за наводку на страницу на доках.