Подтвердить что ты не робот

Запрос браузеров на кеширование как можно более агрессивно

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

Вот ваш образ. Идите вперед и держите его; это действительно не изменится в течение следующих нескольких дней. Не нужно возвращаться. В самом деле. Я обещаю.

До сих пор я устанавливал

Cache-Control: public, max-age=86400
Last-Modified: (some time ago)
Expires: (two days from now)

и, конечно, верните a 304 not modified, если запрос имеет соответствующий заголовок If-Modified-Since.

Есть ли что-нибудь еще, что я могу сделать (или что-нибудь, что я должен сделать по-другому), чтобы передать мое сообщение в браузер?

Приложение размещено в Google App Engine, если это имеет значение.

4b9b3361

Ответ 1

Вам может быть интересно узнать следующую статью в Google Code:

Вкратце, все современные браузеры должны иметь возможность кэшировать ваши изображения соответствующим образом, как указано, с этими заголовками HTTP.

Ответ 2

Вы можете сделать лучше. 304s по-прежнему являются HTTP-запросом/ответом. Хотя изображение не загружается снова, задержка может быть убита.

Если вы можете включить идентификатор версии в свои имена изображений, вы можете установить максимальный возраст до 2 лет. Таким образом, вы предотвращаете 304s. Если изображение когда-либо изменяется, вы обновляете идентификатор версии, тем самым изменяя имя файла. Это гарантирует, что браузер выдаст новый запрос.

Он нуждается в некоторых изменениях в структуре вашего проекта. Идентификатор версии может быть номером ревизии SVN при последнем обновлении изображения и может быть автоматически сгенерирован во время сборки. Вам также необходимо обновить html, поэтому, если у вас есть логическое сопоставление между именем изображения и контуром изображения, ваша работа будет проще.

Изображения редко обновляются, поэтому вы также можете следовать ручному подходу, если вы не можете автоматизировать то, что я описал выше. Хитрость заключается только в том, чтобы добавлять новые изображения, никогда не изменять их.

Ответ 3

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

"post-check = 900, pre-check = 3600"

Прочитайте эту статью по этой теме (и найдите больше):

http://www.rdlt.com/cache-control-post-check-pre-check.html

Ответ 4

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

Ответ 5

Попробуйте .htaccess как

<ifmodule mod_gzip.c>
  mod_gzip_on Yes
  mod_gzip_dechunk Yes
  mod_gzip_item_include file \.(html?|txt|css|js|php|pl)$
  mod_gzip_item_include handler ^cgi-script$
  mod_gzip_item_include mime ^text/.*
  mod_gzip_item_include mime ^application/x-javascript.*
  mod_gzip_item_exclude mime ^image/.*
  mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
</ifmodule>

<ifmodule mod_deflate.c>
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
AddType application/x-httpd-php .php
AddType application/x-httpd-php .php3
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE application/x-httpd-php
AddOutputFilterByType DEFLATE application/x-javascript
</ifmodule>

<ifmodule mod_expires.c>
  ExpiresActive On
  ExpiresDefault "access plus 1 seconds" 
  ExpiresByType text/html "access plus 1 seconds" 
  ExpiresByType image/gif "access plus 2592000 seconds" 
  ExpiresByType image/jpeg "access plus 2592000 seconds" 
  ExpiresByType image/png "access plus 2592000 seconds" 
  ExpiresByType text/css "access plus 604800 seconds" 
  ExpiresByType text/javascript "access plus 216000 seconds" 
  ExpiresByType application/x-javascript "access plus 216000 seconds" 
</ifmodule>

<ifmodule mod_headers.c>
  <filesMatch "\\.(ico|pdf|flv|jpg|jpeg|png|gif|swf)$">
    Header set Cache-Control "max-age=2592000, public" 
  </filesmatch>
  <filesMatch "\\.(css)$">
    Header set Cache-Control "max-age=604800, public" 
  </filesmatch>
  <filesMatch "\\.(js)$">
    Header set Cache-Control "max-age=216000, private" 
  </filesmatch>
  <filesMatch "\\.(xml|txt)$">
    Header set Cache-Control "max-age=216000, public, must-revalidate" 
  </filesmatch>
  <filesMatch "\\.(html|htm|php)$">
    Header set Cache-Control "max-age=1, private, must-revalidate" 
  </filesmatch>
</ifmodule>

Ответ 6

Вы можете добавить представление ETag для каждого изображения, а затем сравнить его с заголовком If-None-Match при входящих запросах (см. "Почему это не мое заказное кэширование изображений в браузере??" ). Это избыточно при использовании предпочтительного заголовка Last-Modified, и это просто еще один способ сказать 304. (Я думаю, что GAE делает это автоматически для статических файлов, но не уверен, хотя.)

Граватар устанавливает очень старые Last-Modified даты - по умолчанию кажется, что "Wed, 11 Jan 1984 08:00:00 GMT". Задержка в 5 минут заставляет браузеры часто проверять обновленные изображения. Другими словами, я думаю, что они приглашают 304s, не пытаясь убедить браузеры просто использовать локальный кеш. Их заголовки выглядят так:

Date: Sat, 20 Mar 2010 07:52:43 GMT
Last-Modified: Wed, 11 Jan 1984 08:00:00 GMT
Expires: Sat, 20 Mar 2010 07:57:43 GMT
Cache-Control: max-age=300

Большая разница - время истечения срока действия - вы хотите два дня, они хотят пять минут. Поэтому, если вы хотите, чтобы браузеры просто использовали кешированное изображение в течение 48 часов, сделайте то, что вы делаете, установите только Cache-Control: max-age=172800 (86400 - 24 часа).

Ответ 7

Несколько дней кэш-код очень низок. Вы должны установить его на один год или даже больше. Конечно, это может вызвать проблемы, когда изображение действительно меняется, но вы можете решить это, добавив номер версии к изображению и изменив страницу, которая ссылается на изображение, чтобы включить путь к новому изображению.

Я больше писал о кешировании веб-приложений: http://patchlog.com/web/7-methods-to-cache-web-applications/