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

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

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

Cache-Control: public, max-age=3600000

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

И у меня есть дистрибутив Amazon CloudFront с минимальным 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 по-прежнему делает второй запрос вместо чтения его из кэша.

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, но для контроля за кешем public он отправляет его. Мои объекты S3 никогда не будут меняться, они неизменяемы, когда мы меняем файл, мы помещаем их как новый объект с новым URL-адресом.

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

Если Chrome Developer Tools открыты (F12), Chrome обычно отключает кеширование.

Он управляется в настройках инструментов разработчика - значок Gear справа от верхней панели dev-tools.

Ответ 4

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

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