Браузер намертво кэширует стили и скрипты? Обновление стилий происходит только после нажатия клавиш Ctrl+f5? А при обычном обновлении страницы упорно продолжают подгружаться устаревшие css, скрипты и прочие файлы, который вы, будучи разработчиком уже поправили.
Такая ситуация не редка, и может весьма раздражать, заставляя буквально каждый раз вручную обновлять кэш, зижимая Ctrl+f5. Но неудобство на рабочем компьютере — пол беды. А реальные проблемы могут возникунуть:
- При просмотре сайта заказчиком, которого не всегда можно научить "правильно перезагружить страницу"
- При тестировании на мобильном устройстве, где скинуть кэш бывает совсем не просто
Решение проблемы кыширования CSS и скриптов
Для решения проблемы кэша CSS, скриптов и прочих файлов рекомендую воспользоваться весьма изящным способом. Всего лишь на всего нужно добавить хэш файла как GET-параметр к адресу файла
Эту задачу легко можно релизовать с помощью встроенной php-функции md5_file()
, на вход она принемает путь к файлу, а выдает хэш. Ниже представлено простой скрипт, реализующий эту идею.
Именно таким образом интернет-гиганты обновляют дизайн у всех пользователей, не прося каждого нажать Ctrl+f5.
function fileCashFix($input){ $file_path = $_SERVER['DOCUMENT_ROOT'].$input; if(file_exists($file_path)){ return $input."?".md5_file($file_path); }else{ return $input; } }
После того как вы так или иначе применили этот подход вы можете:
- Не беспокоиться о том, что кому-то подгрузится неактуальный файл.
- Настроить максимальное время жизни кэша этих файлов в htaccess
Сниппет для MODx
- Название сниппета:
fileCashFix
- Использование сниппета:
<link href="[[!fileCashFix?input=`css/style.css`]]" rel="stylesheet">
$file_path = MODX_BASE_PATH.$input; if(file_exists($file_path)){ return $input."?".md5_file($file_path); }else{ return $input; }
Для внешнего файла
! Запрос file_get_contents($input)
может замедлять работу сайта, так как закачивает файл на сервер.
Использование сниппета: [[!fileCashFix?input=`https://fonts.googleapis.com/css?family=Roboto:400`]]
. Важно указать именно https://
или https://
— просто //
не пройдет.
$file_path = MODX_BASE_PATH.$input; if(file_exists($file_path)){ return $input."?".md5_file($file_path); }else{ // Если не нашли файл у себя, может быть передана ссылка на внешний файл $external_file = file_get_contents($input); if($external_file){ // Проверяем, есть ли уже GET-параметры в запросе к файлу if(strpos($input, "?") !== false){ return $input."&fileCashFix=".md5($external_file); }else{ return $input."?fileCashFix=".md5($external_file); } }else{ return $input; } }
на Wordpress это как можно приспособить, куда кидать файл со сниппетом, в корень или добавлять код сниппета в файл function.php шаблона?