У меня есть страница, которая загружает много изображений, CSS и JavaScript. Я добавил, что далекое будущее Истекает заголовок и установило Управление Кэша на общественность на этих внешних зависимостях, таким образом, они должны кэшироваться. Но каждый раз я делаю Отправить/Перенаправить/Получить хром попытки загрузить их снова. Это поведение очень похоже на перезагрузку страницы. Я добавил Завершающие теги и обрабатываю заголовок If-None-Match, который помогает немного, но он все еще генерирует слишком много бесполезных запросов.
Как я говорю хрому и сафари получать файлы от кэша?
chrome NOK
safari NOK
firefox OK
ie OK
Также посмотрите, что Полностраничная перезагрузка на Отправляет/Перенаправляет/Получает управление кэшем игнорирования на форуме поддержки Google.
Разъяснение:
Я не хочу, чтобы браузер запросил image1.png
дважды. Это должно кэшироваться.
200 GET page1.html
200 GET image1.png (Cache-Control: public, Expires and ETag)
302 POST action.asp (form submitted from page1.html, redirects)
200 GET page2.html
304 GET image1.png (If-None-Match)
Пример:
Я создал простой пример для иллюстрирования проблемы.
Заголовки:
Заголовки, которые я отправляю с изображением:
HTTP/1.1 200 OK
Date: Fri, 18 Jun 2010 11:30:22 GMT
Server: Apache
Cache-Control: public, max-age=86400
Expires: Sat, 19 Jun 2010 11:30:24 GMT
Etag: "123"
Content-Length: 866
Content-Type: image/png
Который должен сделать, это кэшировалось в течение 24 часов. Существует, не Варьируйтесь: * или что-либо как этот.
Обновление: Это поведение теперь также присутствует в Safari, Мобильном на iOS 4. Ужасная регрессия в скорости под нагрузкой страницы.
Обновление: существует bugreport об этой проблеме в Bugzilla WebKit. Ошибка 38690 - Отправление сообщения, которое приводит к перенаправлению сервера, заставляет все кэшируемые элементы повторно загружать
Обновление: проблема сохраняется на iOS 4.0.1
Обновление: проблема сохраняется на iOS 4.1
Обновление: проблема сохраняется на iOS 4.2
Обновление: проблема сохраняется на iOS 4.2.1 и в Chrome от версии 6 до 9.
Обновление: существует bugreport об этой проблеме в проекте Хрома. (можно соединить его звездой, чтобы показать, что Вы заботитесь), Выпуск 68621: отправьте/Перенаправьте/Получите инструкции по кэшу игнорирования
Обновление: проблема сохраняется на Chrome от версии 6 до 10. Это - теперь 9-месячная ошибка.
Обновление: проблема решена с 21.03.2011 19:33:07 PST. Это отражается в поведении хрома 12 (канарейка).
При F5/refresh в Chrome, Safari или IE8 все GET-ресурсы запрашиваются снова, даже если они были закэшированы.
Если вы посмотрите запрос/ответ с помощью dev tools или Fiddler, вы увидите, что сервер отвечает статусом HTTP 304 без содержимого. Это говорит браузеру, что ему не нужно загружать его снова и что он может продолжать использовать кэш.
На вкладке Resource инструментов разработчика Chrome файлы, обновленные таким образом, будут иметь время задержки, но время загрузки составит 0 мс.
Если вы перезагрузите страницу, уйдя и вернувшись, вы обнаружите, что эти кэшированные файлы не извлекаются снова и сервер не проверяется.
Такое поведение F5/refresh для статического ресурса GET является правильным - это FX и IE6 делают это неправильно. Это также помогает справиться с запутанной командой CTRL+F5, о которой большинство пользователей не знают.
Вы не можете кэшировать POST или страницы, которые возвращают временное перенаправление HTTP:
POST изменяет данные и всегда должен запрашиваться перед повторной отправкой, а его результаты никогда не кэшируются.
Перенаправления обрабатываются на низком уровне в HTTP - ниже кэширования. На самом деле это говорит браузеру получить ресурс из другого места, и хотя он может кэшировать этот ресурс, он не кэширует перенаправление и должен проверить его снова.
Вы должны иметь возможность кэшировать 301 постоянный редирект, но 302 или 303 временные редиректы не должны кэшироваться согласно спецификации HTTP.