В этой заметке пойдое речь о кешировании различного рода файлов средствами апачи.
Большинство начинающих веб разработчиков избегает пользоваться HTTP кешированием. В этой заметке я хоче поделиться опытом.
Чтобы закешировать рисунки в файл .htaccess следующие строки:
<IfModule mod_expires.c>
# turn on the module for this directory
ExpiresActive on
# cache common graphics for 10 years
ExpiresByType image/jpg "access plus 10 years"
ExpiresByType image/gif "access plus 10 years"
ExpiresByType image/jpeg "access plus 10 years"
ExpiresByType image/png "access plus 10 years"
# cache CSS for 24 hours
ExpiresByType text/css "access plus 10 years"
# set the default to 24 hours
ExpiresDefault "access plus 2 hours"
</IfModule>
Что делает приведенная настройка, в случае если апач установлен c модулем mod_expires, то на все основные гравические файлы и файлы стилей устанавливается кеширование на 10 лет.
Тут-то все и пугаются. А что будет, если какие-либо файлы изменяться? Браузер просто не будет скачикать? Давайте посмотрим, что можно сделать в этом случае.
Естественный ответ - поменять путь до файла, например добавить какой либо GET параметр. Тут вариантов много.
Например, формировать адрес файла следующим образом:
md5 = md5-хеш отфайла.
И тогда адрес до файла отдавать в виде: file_url?version=md5
Если файл изменился, то соответственно изменится и его хеш. Естественно, что вычислять данное значение нежно только 1 раз при изменении файла.
В случае же рисунков, которые загружают пользователи такой метод не очень хорош... Даже совсем не хорош:) Как же быть? Если вайлы, загружают пользователи, то как правило о каждом файле делается запись в базе данных. А что нам мешает туда же записывать время последнего изменения файлов? Вот и будем при каждом обновлении рисунка обновлять время в базе данных. Дальне все просто - отдаем адрес файла в виде: file_url?version=update_time
Таким образом, мы создали некоторую "защиту" от протухшего кеша. Таким образом пользователь всегда может увидеть изменившуюся картинку, даже если она закеширована на 10 лет.
Комментарии