Опыт кэширования страниц
В сети много написано о том, как запретить браузеру кэшировать загружаемую информацию, и совсем мало — о том, как заставить браузер использовать кэш. И как оказалось, браузеры настроены агрессивно на любое наше желание. Т.е., если нам нужно не кэшировать получаемые данные, то браузеры по умолчанию их кэшируют, и требуется совершить ряд манипуляций, чтобы отбить у них желание это делать. Но если нам нужно, чтобы кэш использовался, то окажется, что ряд браузеров по умолчанию не кэшируют ничего, и нужно сделать опять-таки ряд манипуляций, при чём неожиданных, на первый взгляд, чтобы заставить браузеры это сделать.
Опишу сначала задачу. Есть флэш-плэйер, который должен обращаться к скрипту на сервере, чтобы тот выдал ему в качестве результата mp3-содержимое. И когда посетитель сайта нажимает паузу, а потом снова воспроизведение, флэшка заново начинает закачивать файл (именно с самого начала) и как только доходит до места останова, возобновляет воспроизведение. Реакция, прямо скажем, нежелательная. Выход — чтобы содержимое бралось из кэша. Скажу сразу, что идеально в этой ситуации повёл себя лишь Internet Explorer. Он действительно всё загнал в кэш и брал потом оттуда. Это выражалось в том, что когда весь файл загружался, паузы между нажатием возобновления и началом звучания практически не было. А вот остальные браузеры тормозили.
И я начал своё исследование. Прежде всего добавил следующие заголовки перед выдачей содержимого:
- Код: Выделить всё
Cache-Control: public, max-age=86400, must-revalidate
Expires: Sat, 27 Nov 2010 11:33:30 +0300 (на сутки больше текущей)
Безрезультатно. Mozilla Firefox пытается создать кэш, но в этом кэше Expires почему-то оказывается в январе 1970 г. И тут я обратил внимание на то, что мой скрипт почему-то выдаёт заголовок Pragma: no-cache. Это, скорей всего, сервер подсовывает. Я видел это, но не обращал внимания, т.к. везде в интернете написано, что Pragma — устаревший стандарт, и ни один браузер его уже не поддерживает. На всякий случай решил написать:
- Код: Выделить всё
Pragma: cache
И — о чудо! — заработало! Правда опять-таки не везде. Mozilla Firefox начал действительно пользоваться кэшем, при чём Expires в нём стал именно тем, который указывал я. Google Chrome тоже стал бодрее возобновлять звучание. А вот Оперу я так и не победил. Что-то ей ещё не хватает.
Итак, вот что у меня выдаёт сейчас скрипт (и сервер вместе с ним)
- Код: Выделить всё
Server: nginx/0.7.65
Date: Fri, 26 Nov 2010 08:33:30 GMT
Content-Type: audio/mpeg
Connection: keep-alive
X-Powered-By: PHP/5.2.8
Expires: Sat, 27 Nov 2010 11:33:30 +0300
Cache-Control: public, max-age=86400, must-revalidate
Pragma: cache
Content-Length: 5430102
Accept-Ranges: bytes