2016-12-12 4 views
0

Я управляю кешированием HTTP в своих приложениях. И это не работает, как мне кажется. Давайте на конкретном примере:Как работает максимальный возраст HTTP и срок действия кеша через некоторое время?

С первого служить моей PHP страницы служу следующие HTTP заголовки:

HTTP/1.1 200 OK 
Date: Mon, 12 Dec 2016 16:39:33 GMT 
Server: Apache/2.4.9 (Win64) PHP/5.5.12 
Expires: Tue, 01 Jan 1980 19:53:00 GMT 
Cache-Control: private, max-age=60, pre-check=60 
Last-Modified: Mon, 12 Dec 2016 15:57:25 GMT 
Etag: "a2883c859ce5c8153d65a4e904c40a79" 
Content-Language: en 
Content-Length: 326 
Keep-Alive: timeout=5, max=100 
Connection: Keep-Alive 
Content-Type: text/html; charset=UTF-8 

Мое приложение управлять проверку ETags и отправить 304, если ничего не изменилось, и когда вы обновите страницу в браузере (F5), вы получите (если ничего не изменилось на стороне сервера):

HTTP/1.1 304 Not Modified 
Date: Mon, 12 Dec 2016 16:43:10 GMT 
Server: Apache/2.4.9 (Win64) PHP/5.5.12 
Connection: Keep-Alive 
Keep-Alive: timeout=5, max=100 

Поскольку я служу Cache-Control: private с max-age=60 я бы ожидать, что после одной минуты кэш будет считаться устаревшим по б rower, и он запросит новую копию (эквивалент перезагрузки Ctrl + F5), но кеш остается действительным через несколько дней после того, как он max-age.

Я не понял этот механизм HTTP? Я посылаю что-то неправильно или, возможно, что-то пропустил?

+0

@ Дагон Да, я знаю, но в моем примере через 1 минуту F5 не запрашивал новую копию (например, Ctrl + F5)? На данный момент через 3 дня после того, как F5 по-прежнему отвечает с 304, как если бы кеш по-прежнему был недопустимым ... – AlexV

+0

это не может быть кеш браузера, могут быть другие кеши между сервером и клиентом, такие как ISP. И никто не обязан следовать «правилам» –

+0

Зачем загружать новую копию текущего, которую вы можете переустановить? В этом весь смысл 304s, чтобы сохранить вас, что загрузка ресурса не изменилась, и у вас все еще есть кешированная копия. –

ответ

1

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

Если он превышает максимальный возраст, то считается stale.

Если браузеру нужен ресурс, и он имеет новую копию в кеше, то он будет использовать это, не возвращаясь с сервером.

Если браузер имеет устаревшую копию, он будет проверять это на сервере (в данном случае, используя Etags), чтобы увидеть, нужна ли ему новая копия, кешированная копия все еще в порядке.

+0

О, я вижу, мне нужно проверить это с помощью некоторых тестов и вернуться к вам с моими выводами! – AlexV

+0

ОК, поэтому в моем примере, похоже, браузер всегда проверяет Etags с браузером, даже когда он находится в кеше <60 секунд. Вы видите что-то в моих заголовках, которые могут вызвать это? Я могу настроить демо-версию, если это поможет. – AlexV

+0

Если вы обновите F5. Он всегда проверяется с помощью проверки на сервере. См. Мой ответ здесь для получения дополнительной информации (и удобный отзыв/предупреждение о gzip + etags - хотя я вижу, что вы не используете это в приведенном выше примере): http://stackoverflow.com/questions/33926999/enable-caching-of- css-and-js-files-in-apache/33927289 –