У картинок, к которым применены стили, уже есть один параметр — это itok. Он появился в 7ке для уменьшения возможностей проведения DDoS атак на ваш Drupal сайт.
СЕО-шникам он не нравится, и иногда они просят его отключить. Как отключить ITOK читайте вот тут. Так что добавление ещё одного параметра им точно не понравится. Хотя в robots.txt всегда можно настроить какие параметры робот должен пропускать, потому не вижу в этом особой проблемы.
Браузеры очень любят грузить картинки из кеша, и не всегда удобно чистить этот кеш пользователю.
Если изображение изменилось, но его название (url) осталось прежним, то браузер скорее всего не будет его запрашивать повторно. К примеру, так происходит при использовании модуля imagefield_crop.
В некоторых случаях бразуер все же делает запрос на сервер, а сервер может ответить, что файл не менялся (304 код). В таком случае, картинка также будет взята из кеша на стороне клиента. Но в данном случае — все будет так, как и должно быть.
Как заставить браузер прочитать изображение вновь?
Вот для этого нам и нужен ещё один параметр. Мы не можем менять itok, так как он генерируется системой на основе названия стиля изображения и uri картинки. А если адрес и стиль не менялись — то itok останется прежним.
Добавляем параметр в адрес картинки.
Итак, как нам добавить параметр в адрес картинки? Есть несколько путей, каждый со своими особенностями. Самый простой — изменить адрес непосредственно в шаблоне. Его я рассматривать не буду, т.к. он прост, но не очень удобен, в особенности, для уже собранных проектов.
Использование hook_file_url_alter().
Данный хук цепляется за все вычисления url, который производит движок drupal. Потому вызываться он будет десятки раз за время построения страницы, для js и css файлов, в том числе.
Нужно отделить «зерна» от «плевел»:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
function MODULENAME_file_url_alter(&$uri) { $parts = parse_url($uri); if (!empty($parts['query'])) { parse_str($parts['query'], $gets); if (!empty($gets['itok'])) { // cb - аббревиатура cache block $uri .= '&cb=' . time(); } } else if (strpos($uri, '/styles/') !== false) { $uri .= '?cb=' . time(); } } |
Если использовать значение параметра как в примере, то вы совсем отключите кеширование изображений в браузере. Это может существенно увеличить нагрузку на ваш сервер. На практике такое значение не используют.
Использование переопределения theme_image функции.
Этот подход гораздо точнее локализует задачу. Если вы идете «путями drupal», то ничего более и не потребуется.
1 2 3 4 5 6 7 |
function THEMENAME_image($vars) { if (strpos($vars['path'], '?') !== false && !empty($vars['style_name'])) { $path = $vars['path']; $vars['path'] = $vars['path'] . '&cb=' . time(); } return theme_image($vars); } |
Тоже самое можно сделать и для других theme функций, вот пример для theme_image_url_formatter(), если вы используете соответствующий сторонний модуль:
1 2 3 4 5 6 7 8 |
function THEMENAME_image_url_formatter($vars) { $path = theme_image_url_formatter($vars); if (strpos($path, '?') !== false) { $path .= '&cb=' . time(); } return $path; } |
Вместо функции time() разумно использовать timestamp последней модификации файла. Вам может понадобится вариант filemtime, который работает с URL, а не именем файла.