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