2009-11-24 5 views
3

Проблема: Я не могу показаться, чтобы получить FireFox кэшировать изображения, отправленные из динамического сервераBrowser Control Cache, Dynamic Content

Установка: Статический сервер Apache с обратным прокси для динамического сервера (mod_perl2) на бэкэнд.

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

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

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 

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

Response Headers

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 в заголовке запроса перезагрузки выше.

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

ответ

3

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

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

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

Таким образом, страница отображается быстро, YSlow сообщает о кешированном содержимом. Но сервер все еще прибивается.

Резолюция предназначена для опроса входящих заголовков в сценарии динамического сервера и определения наличия заголовка «If-Modified-Since». Если это так, и определено, что контент не изменился, возвращается ответ HTTP_NOT_MODIFIED (304).

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

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

Надеется, что это помогает кто-то кроме меня :)

5

оригинальный запрос имеет

Cache-Control: no-cache 

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

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

Cache-Control: public, max-age=31536000 

, который говорит всем, что, насколько сервер происхождения обеспокоен, ответ может кэширования. Сервер, кажется, настроен для того, чтобы PNG изображение кэшировать: HTTP 1.1 (раздел 14,21) говорит:

Примечание: если ответ включает в себя поле Cache-Control с директивой максимального возраста (смотри раздел 14.9.3), что директива переопределяет поле Expires.

Ваш второй запрос говорит:

Cache-Control: max-age=0 

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

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

BTW, мне нравится плагин FireBug для Firefox. Вы можете просмотреть заголовки запросов и ответов с ним и всевозможные другие полезные материалы.

+0

Hi Jim: Спасибо за вашу помощь! Первый запрос исходит из Firefox, когда я нажимаю shift-reload. Это кажется уместным, поскольку я прямо спрашиваю «свежий» контент. И первый ответ кажется правильным; он имеет предназначенные заголовки. Второй запрос происходит при перезагрузке браузера/без/сдвига. Ожидается, что кеш firefox выполнит первый ответ, например. макс возраста = 31536000. Похоже, сервер говорит, что все изображения (изображение/*) можно кэшировать. Если все это правильно, возникает вопрос, почему FireFox игнорирует директивы кэша? –

+0

Я должен добавить, кеш включен в FireFox, и он успешно кэширует изображения со статического сервера. Я также удалил заголовки, но не люблю. –

1

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

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

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

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

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). Например, я могу сделать последнюю измененную дату 01 января 2000 года и дату истечения срока в 2050 году.

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

+0

ps Я подал ошибку с FireBug по 200 сообщениям из локального кеша –