Добавляем параметр к картинкам в Drupal, для преодоления кеширования со стороны браузера

У картинок, к которым применены стили, уже есть один параметр — это itok. Он появился в 7ке для уменьшения возможностей проведения DDoS атак на ваш Drupal сайт.

СЕО-шникам он не нравится, и иногда они просят его отключить. Как отключить ITOK читайте вот тут. Так что добавление ещё одного параметра им точно не понравится. Хотя в robots.txt всегда можно настроить какие параметры робот должен пропускать, потому не вижу в этом особой проблемы.

Браузеры очень любят грузить картинки из кеша, и не всегда удобно чистить этот кеш пользователю.

Если изображение изменилось, но его название (url) осталось прежним, то браузер скорее всего не будет его запрашивать повторно. К примеру, так происходит при использовании модуля imagefield_crop.

В некоторых случаях бразуер все же делает запрос на сервер, а сервер может ответить, что файл не менялся (304 код). В таком случае, картинка также будет взята из кеша на стороне клиента. Но в данном случае — все будет так, как и должно быть.

Как заставить браузер прочитать изображение вновь?

Вот для этого нам и нужен ещё один параметр. Мы не можем менять itok, так как он генерируется системой на основе названия стиля изображения и uri картинки. А если адрес и стиль не менялись — то itok останется прежним.

Добавляем параметр в адрес картинки.

Итак, как нам добавить параметр в адрес картинки? Есть несколько путей, каждый со своими особенностями. Самый простой — изменить адрес непосредственно в шаблоне. Его я рассматривать не буду, т.к. он прост, но не очень удобен, в особенности, для уже собранных проектов.

Использование hook_file_url_alter().

Данный хук цепляется за все вычисления url, который производит движок drupal. Потому вызываться он будет десятки раз за время построения страницы, для js и css файлов, в том числе.

Нужно отделить «зерна» от «плевел»:

Если использовать значение параметра как в примере, то вы совсем отключите кеширование изображений в браузере. Это может существенно увеличить нагрузку на ваш сервер. На практике такое значение не используют.

Использование переопределения theme_image функции.

Этот подход гораздо точнее локализует задачу. Если вы идете «путями drupal», то ничего более и не потребуется.

Тоже самое можно сделать и для других theme функций, вот пример для theme_image_url_formatter(), если вы используете соответствующий сторонний модуль:

Вместо функции time() разумно использовать timestamp последней модификации файла. Вам может понадобится вариант filemtime, который работает с URL, а не именем файла.

Мало букафф? Читайте есчо !

Хак с Form API в Drupal 7: создаём HTML5‑поля (number, email, tel) без лишних модулей

Март 15, 2026 г.

Drupal 7 предлагает мощный Form API для построения форм. Однако при работе с HTML5‑атрибутами можно столкнуться с неожиданным ограничением: если вы попытаетесь задать тип поля number, email или tel стандартным способом, Drupal проигнорирует ваше значение ...

Читать

Программируем галерею в Drupal 7

Сентябрь 2, 2015 г.

Хотите сделать галерею своими руками, без сторонних модулей в Drupal? Тогда читайте дальше. Настроим поле для галереи Для начала нам надо определиться, ...

Читать

Меняем сортировку комментариев в Drupal 7 без views

Декабрь 2, 2016 г.

Комментарии в Drupal выводятся от старых к новым. Т.е. чтобы увидеть последний (свежий) комментарий нужно идти на самую последнюю страницу (если комментарии разбились на несколько страниц) в самый конец списка комментариев. Как изменить порядок вывода ...

Читать

Ctools modal закрытие при клике вне модального окна

Июнь 28, 2019 г.

Привычное для пользователей поведение модального окна изначально не реализовано в ctools. Давайте добавим немного js, реализующего нужный функционал. Код универсален для модального окна создаваемого ctools, т.к. привязан к верстке окна: [crayon-6a64ba5d72a27613167941/] ...

Читать
 

Комментарии к «Добавляем параметр к картинкам в Drupal, для преодоления кеширования со стороны браузера»

Понравилась статья? Есть вопросы? - пишите в комментариях.



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