Почему браузер по-прежнему отправляет запрос на контроль кэша публично с max-age?

У меня есть объекты Amazon S3, и для каждого объекта я установил

Cache-Control: public, max-age=3600000

Это примерно 41 день.

И у меня есть Amazon CloudFront Distribution с минимальным TTL и 3600000.

Это первый запрос после очистки кеша.

GET /1.0.8/web-atoms.js HTTP/1.1
Host: d3bhjcyci8s9i2.cloudfront.net
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8

И ответ

HTTP/1.1 200 OK
Content-Type: application/x-javascript
Content-Length: 226802
Connection: keep-alive
Date: Wed, 28 Aug 2013 10:37:38 GMT
Cache-Control: public, max-age=3600000
Last-Modified: Wed, 28 Aug 2013 10:36:42 GMT
ETag: "124752e0d85461a16e76fbdef2e84fb9"
Accept-Ranges: bytes
Server: AmazonS3
Age: 342557
Via: 1.0 6eb330235ca3971f6142a5f789cbc988.cloudfront.net (CloudFront)
X-Cache: Hit from cloudfront
X-Amz-Cf-Id: 92Q2uDA4KizhPk4TludKpwP6Q6uEaKRV0ls9P_TIr11c8GQpTuSfhw==

Несмотря на то, что Amazon явно отправляет Cache-Control, Chrome по-прежнему делает второй запрос, а не читает его из Cache.

GET /1.0.8/web-atoms.js HTTP/1.1
Host: d3bhjcyci8s9i2.cloudfront.net
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
If-None-Match: "124752e0d85461a16e76fbdef2e84fb9"
If-Modified-Since: Wed, 28 Aug 2013 10:36:42 GMT

Вопрос: почему хром делает второй запрос?

Истекает Это поведение изменяется, когда я помещаю явный атрибут Expires в заголовки. Браузер не будет отправлять последующий запрос на заголовок Expires, но для общедоступного управления кэшем он отправляет его. Мои все объекты S3 никогда не изменятся, они неизменны, когда мы меняем файл, мы помещаем их как новый объект с новым URL.

В справочнике скриптов страниц Chrome делает последующие запросы только иногда, я сделал этот тест, фактически набрав URL в браузере. Когда на скрипт ссылается HTML-страница, для нескольких последующих запросов chrome загружает кэшированные скрипты, но снова через некоторое время, время от времени, отправляет запрос на сервер. Здесь нет проблемы с размером диска, в Chrome достаточно кеша.

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

5 ответов

Решение

Если HTTP-ответ содержит запись etag, условный запрос будет выполнен всегда. ETag - это тег валидатора кеша. Клиент всегда отправляет etag на сервер, чтобы посмотреть, был ли изменен элемент.

Когда вы нажимаете F5 в Chrome, он всегда будет отправлять запросы на сервер. Это будет сделано с Cache-Control:max-age=0 заголовок. Сервер обычно отвечает кодом состояния 304 (не изменен).

Когда вы нажимаете Ctrl+F5 или Shift+F5, выполняются те же запросы, но с Cache-Control:no-cache заголовок, что заставляет сервер отправлять некэшированную версию, обычно с кодом состояния 200 (ОК).

Если вы хотите убедиться, что вы используете локальный кеш браузера, просто нажмите Enter в адресной строке.

Если инструменты разработчика Chrome открыты (F12), Chrome обычно отключает кэширование.

Это можно контролировать в настройках Developer Tools - значок Gear справа от верхней панели dev-tools.

Chrome добавляет Cache-control: max-age=0заголовок при использовании самозаверяющего сертификата. При переключении с HTTPS на HTTP этот заголовок будет удален.

Firefox не добавляет этот заголовок.

Если вы нажимаете кнопку обновления для загрузки конкретной страницы или ресурса, if-modified-since Запрос заголовка отправляется каждый раз, если вы вместо этого запрашиваете страницу / ресурс как отдельный запрос на новой вкладке или по ссылке в скрипте или html-странице, он загружает страницу / ресурс из самого кэша браузера.

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

Другие вопросы по тегам