Полностраничная перезагрузка на Отправляет/Перенаправляет/Получает управление кэшем игнорирования

У меня есть страница, которая загружает много изображений, 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://crydust.be/lab/prg/

Заголовки:

Заголовки, которые я отправляю с изображением:

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 (канарейка).

11
задан 17 revs 2 May 2011 в 07:31
поделиться

1 ответ

При 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.

1
ответ дан 3 December 2019 в 12:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: