Управление кэшем

Л2
На сайте с 26.01.2008
Offline
138
642

На сервере есть папка в которой лежат фотографии галереи. Галерея обновляется раз в 15 дней, при этом имена файлов остаются прежними и изменить это нельзя.

Задача: заставить браузер кэшировать фотографии до того момента, пока он не обнаружит, что они изменились.

По умолчанию браузер фото кэширует, но не надолго, на час-два, а потом опять перезагружает (вижу по скорости работы галереи).

Добавил в .htaccess в папке галереи такие строки

<FilesMatch ".*$">

Header set Cache-Control "max-age=1296000"
</FilesMatch>

Начало кэшироваться и летать, я обрадовался, но потом понял, что тот кто зайдет на 14-й день, просмотрит все фото, а потом зайдет на 16-й день, когда фото обновились, он не увидит новые фото, так как еще не прошло 15 дней (1296000 с) с его последнего визита.

Нашел в интернете, что можно задавать в заголовке expires, но это не практично каждый раз лазить дату менять, хотелось бы чтобы оно работало в автоматическом режиме, а именно: заставить браузер кэшировать фотографии до того момента, пока он не обнаружит, что они изменились.

Читал, что есть last modification time , но как его прикрутить не могу понять.

Кто что скажет?

Z
На сайте с 06.09.2012
Offline
129
#1
Лёлик2:
Задача: заставить браузер кэшировать фотографии до того момента, пока он не обнаружит, что они изменились.

Это поведение браузеров и веб-сервера по умолчанию.

Когда браузер первый раз посылает запрос, он сохраняет фотографию в кэш. Каждый следующий раз он посылает запрос с if-modified-since заголовком, а веб-сервер отвечает кодом 304, если фотография не изменилась. Если изменилась, то отвечает кодом 200 и новой фотографией.

Черный список врунов и обманщиков: ua-hosting.company, riaas.ru, takewyn.ru, yahoster/cadedic, Andreylab
A
На сайте с 19.07.2010
Offline
130
#2
zzzit:
Когда браузер первый раз посылает запрос, он сохраняет фотографию в кэш. Каждый следующий раз он посылает запрос с if-modified-since заголовком, а веб-сервер отвечает кодом 304, если фотография не изменилась. Если изменилась, то отвечает кодом 200 и новой фотографией.

Да, так и есть.

Чтобы браузер не дергался каждый раз с if-modified-since можно отдавать заголовок Expires.

Как-то так:


<IfModule mod_expires.c>
ExpiresActive on
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType image/jpg "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
</IfModule>

Если перед апачем стоит nginx, то Expires нужно отдавать именно в нем.

.............
Л2
На сайте с 26.01.2008
Offline
138
#3

То что при 304 ответе сервера фото не загружается это лишь снижает нагрузку на сервер, но не ускоряет работу галереи, так как время на запрос if-modified-since и потом ответ все равно приличное.

Заставить Chrome работать так как мне нужно удалось только таким заголовком

Header set Cache-Control "public, max-age=3600, must-revalidate"

После этого, он начал брать фото из кеша за 25 милисекунд и галерея начала летать, а если кто-то второй раз зайдет смотреть галерею (по истечению 3600 секунд), то один раз подождет пока if-modified-since слетает туда обратно, а потом снова час "турбо-скорости".

Спасибо всем!

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий