Ответ 1
Вам может быть интересно узнать следующую статью в Google Code:
Вкратце, все современные браузеры должны иметь возможность кэшировать ваши изображения соответствующим образом, как указано, с этими заголовками HTTP.
Это о веб-приложении, которое служит изображениям. Поскольку один и тот же запрос всегда возвращает один и тот же образ, я хочу, чтобы браузеры доступа кэшировали изображения как можно более агрессивно. Я очень хочу сказать браузеру
Вот ваш образ. Идите вперед и держите его; это действительно не изменится в течение следующих нескольких дней. Не нужно возвращаться. В самом деле. Я обещаю.
До сих пор я устанавливал
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, если это имеет значение.
Вам может быть интересно узнать следующую статью в Google Code:
Вкратце, все современные браузеры должны иметь возможность кэшировать ваши изображения соответствующим образом, как указано, с этими заголовками HTTP.
Вы можете сделать лучше. 304s по-прежнему являются HTTP-запросом/ответом. Хотя изображение не загружается снова, задержка может быть убита.
Если вы можете включить идентификатор версии в свои имена изображений, вы можете установить максимальный возраст до 2 лет. Таким образом, вы предотвращаете 304s. Если изображение когда-либо изменяется, вы обновляете идентификатор версии, тем самым изменяя имя файла. Это гарантирует, что браузер выдаст новый запрос.
Он нуждается в некоторых изменениях в структуре вашего проекта. Идентификатор версии может быть номером ревизии SVN при последнем обновлении изображения и может быть автоматически сгенерирован во время сборки. Вам также необходимо обновить html, поэтому, если у вас есть логическое сопоставление между именем изображения и контуром изображения, ваша работа будет проще.
Изображения редко обновляются, поэтому вы также можете следовать ручному подходу, если вы не можете автоматизировать то, что я описал выше. Хитрость заключается только в том, чтобы добавлять новые изображения, никогда не изменять их.
В заголовке кэша очень важно значение, которое вы не упомянули здесь:
"post-check = 900, pre-check = 3600"
Прочитайте эту статью по этой теме (и найдите больше):
Я не знаю, что это поможет, помимо других решений, которые вы предложили, но вы можете использовать HTML5 офлайн-приложения для веб-приложений чтобы явным образом попросить браузер сохранить локальную копию.
Попробуйте .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>
Вы можете добавить представление 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 часа).
Несколько дней кэш-код очень низок. Вы должны установить его на один год или даже больше. Конечно, это может вызвать проблемы, когда изображение действительно меняется, но вы можете решить это, добавив номер версии к изображению и изменив страницу, которая ссылается на изображение, чтобы включить путь к новому изображению.
Я больше писал о кешировании веб-приложений: http://patchlog.com/web/7-methods-to-cache-web-applications/