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