Управление кешем браузера, динамический контент

StackOverflow https://stackoverflow.com/questions/1787850

Вопрос

Проблема: Кажется, я не могу заставить FireFox кэшировать изображения, отправленные с динамического сервера.

Настраивать: Статический сервер Apache с обратным прокси-сервером на динамический сервер (mod_perl2) на бэкэнде.

Вот URL-адрес запроса для сервера.Он отправляется на динамический сервер, где файл cookie используется для проверки доступа к изображению:

Заголовки запросов

Host:  <OBSCURED>
User-Agent:  Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.15) Gecko/2009102815 Ubuntu/9.04 (jaunty) Firefox/3.0.15
Accept:  image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset:  ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive:  300
Connection:  keep-alive
Referer: <OBSCURED>
Cookie:  pz_cred=4KCNr0RM15%2FJCOt%2BEa6%2BL62z%2Fxvbp2xNQHY5pJw5d6Q
Pragma:  no-cache
Cache-Control: no-cache

Динамический сервер передает изображение обратно на сервер и предоставляет следующий ответ:

Заголовки ответов

Date:  Tue, 24 Nov 2009 04:28:07 GMT
Server:  Apache/2.2.11 (Ubuntu) mod_apreq2-20051231/2.6.0 mod_perl/2.0.4 Perl/v5.10.0
Cache-Control: public, max-age=31536000
Content-Length:  25496
Content-Type:  image/jpeg
Via: 1.1 127.0.1.1:8081
Keep-Alive:  timeout=15, max=75
Connection:  Keep-Alive

Пока всё хорошо (думаю я).Однако, при перезагрузке страницы, изображение не отображается в кэше, и запрос снова отправляется:

Заголовки запросов

Host: <OBSCURED>
User-Agent:  Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.15) Gecko/2009102815 Ubuntu/9.04 (jaunty) Firefox/3.0.15
Accept:  image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset:  ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive:  300
Connection:  keep-alive
Referer: <OBSCURED>
Cookie:  pz_cred=4KCNr0RM15%2FJCOt%2BEa6%2BL62z%2Fxvbp2xNQHY5pJw5d6Q
Cache-Control: max-age=0

Кажется, что запрос не должен произойти, поскольку браузер должен был кэшировать изображение.На самом деле получен ответ 200, такой же, как и первый, и изображение, похоже, получено повторно (хотя браузер, похоже, использует кэшированные изображения).

Похоже, на проблему намекает Cache-Control:max-age=0 в заголовке запроса на перезагрузку выше.

Кто-нибудь знает, почему это происходит?Возможно, это С помощью заголовок в ответе, который вызывает проблему?

Это было полезно?

Решение 2

Мой предыдущий ответ был лишь частично правильным.

Проблема это способ, которым Firefox 3 обрабатывает события перезагрузки. По -видимому, это почти всегда запрашивает контент снова на исходном сервере. Таким образом Cache-Control: max-age=0 Запросить заголовок.

Fire Fox делает Используйте кэшированные изображения, чтобы отобразить страницу на перезагрузке, но затем все еще делает все запросы, чтобы обновить их «в фоновом режиме». Затем он заменит их, когда они входят.

Следовательно, страница быстро отображается, отчеты YSLOW, отчеты о кэшированном контенте. Но сервер все еще прибивается.

Разрешение предназначен для опроса входящих заголовков в скрипте динамического сервера и определить, предоставляется ли «IF-модифицированный» заголовок. Если это так, и определено, что содержание не изменилось, возвращается контент, возвращается http_not_modified (304) ответ.

Это не оптимально - я бы предпочел, чтобы Firefox не выполнял запросы вообще - но это сокращает время загрузки страницы пополам и значительно снижает пропускную способность. Учитывая, как Firefox работает на перезагрузке, это кажется лучшим решением.

Другие комментарии: Точка зрения Джима Феррана о том, как выходить из Пейджа и возврат, имеет заслуги - кэш всегда используется, и никакие запросы не являются исходящими (+1 к Джиму). Кроме того, контент, который добавляется динамически (например, вызовы AJAX после начальной нагрузки), по -видимому, также использует кэш.

Надеюсь, это поможет кому -то, кроме меня :)

Другие советы

Первоначальный запрос имеет

Cache-Control: no-cache

Что сообщает всем промежуточным HTTP -кэшам (включая Firefox), что вы не хотите использовать кэшированный ответ, вы хотите получить ответ от самого веб -сервера происхождения.

Ответ говорит:

Cache-Control: public, max-age=31536000

который говорит всем, что в отношении исходного сервера, ответ май быть кэшированным. Сервер, по -видимому, настроен, чтобы включить кэширование изображения PNG: Http 1.1 (Раздел 14.21) говорит:

ПРИМЕЧАНИЕ. Если ответ включает в себя поле управления кэшем с директивой Max-Age (см. Раздел 14.9.3), эта директива переопределяет поле истечения срока действия.

В вашем втором запросе говорится:

Cache-Control: max-age=0

который сообщает всем промежуточным HTTP -кэшам, что вы не получите какого -либо кэшированного ответа старше 0 секунд.

Одна вещь, которую стоит обратить внимание: если вы нажмете кнопку перезагрузки в Firefox, вы просите перезагрузить с веб -сервера происхождения. Чтобы проверить кэширование изображения, перейдите в сторону от страницы и обратно, или откройте его на новой вкладке. Не уверен, почему вы видели без кеша в первый раз, а Max-Age = 0 во втором.

Кстати, мне нравится плагин Firebug для Firefox. Вы можете взглянуть на заголовки запроса и ответов с ним и все виды других хороших вещей.

Похоже, решил:

  • Удален прокси через заголовок
  • Добавлен заголовок Last-Modified.
  • Добавлена ​​дата истечения срока действия в далеком будущем.

Firebug по-прежнему показывает 200 ответов от исходного сервера, однако YSlow распознает изображения как кэшированные.По данным YSlow, общий размер загружаемых изображений в свежем виде превышает 500 КБ;с заполненным кешем отображается размер загрузки 0 КБ.

Вот заголовок ответа от исходного сервера, который помогает:

Date: Tue, 24 Nov 2009 08:54:24 GMT
Server: Apache/2.2.11 (Ubuntu) mod_apreq2-20051231/2.6.0 mod_perl/2.0.4 Perl/v5.10.0
Last-Modified: Sun, 22 Nov 2009 07:28:25 GMT
Expires: Tue, 30 Nov 2010 19:00:25 GMT
Content-Length: 10883
Content-Type: image/jpeg
Keep-Alive: timeout=15, max=89
Connection: Keep-Alive

Из-за того, как я запрашиваю изображения, на самом деле не имеет значения, являются ли эти даты статическими;мое приложение знает время последнего изменения перед запросом изображения и добавляет его к URL-адресу запроса на стороне клиента, чтобы создать уникальный URL-адрес для каждой версии изображения, например http://myserver.com/img/125.jpg?20091122 (информация поступает из канала AJAX JSON).Я мог бы, например, сделать дату последнего изменения 1 января 2000 года, а дату истечения срока действия где-то в 2050 году.

Если YSlow верен — а тестирование производительности предполагает, что это так — тогда FireBug действительно должен сообщать об этих попаданиях в локальный кэш вместо ответа 200.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top