2015-12-24 2 views
3

Я уже давно использую ETags, и я поражен тем, как их можно использовать и что они позволяют делать.ETags: Validation and Cache max-age

Тем не менее, я иногда испытываю запросы проверки ETag. На моем сервере я вижу, что мой браузер попадает в URL-адрес ресурса, а затем получает ответ «Не изменен». Но это все еще запрос.

Как можно умный веб-сервер (я кодирую шахту в NodeJS) избегать проверки с подтверждением до тех пор, пока идет cache-control: max-age=N?

Например, мой max-age указывает TTL на 30 дней. Клиент не должен проверять Etag в это время вообще. Это возможно?

ответ

1

Невозможно заставить это на уровне сервера, так как это решает этот клиент.

Заголовки управления кэшем, такие как ETags, не являются подсказками. Браузер может игнорировать эти подсказки (например, при обновлении страницы, которую вы явно просите браузер перепроверить ресурсы). Некоторые браузеры также периодически перепроверяют ресурсы.

Сказать, что если заголовки управления кешем настроены правильно, то эти запросы должны быть нечастыми, а норма должна быть для того, чтобы запросы не отправлялись.

+0

Хорошо. Похоже, я ничего не могу сделать, кроме предоставления дополнительных советов - appcache и т. Д. Спасибо за головы (: –

+0

Вам также нужно помнить, что кеши браузера не бесконечны, и все будет вытеснено из них (хотя в этом в случае, если вы не получите 304 - не измененный ответ, так как браузер больше не будет иметь оригинальную загрузку или Etag). На самом деле кеши браузера намного меньше, чем вы могли бы подумать, особенно на мобильных устройствах: http: // www. guypo.com/mobile-browser-cache-sizes-round-2/ –

1

Я вижу, что проблема с перерывами на моем конце (FF45 под Ubuntu). Некоторые файлы проверяются при каждой перезагрузке, а большинство - нет. Я не слишком уверен, что скажет Firefox, что такой-то файл должен быть проверен при каждой загрузке.

Согласно сообщению от jscher2000 по a blog, Firefox сначала проверяет Last-Modified и, если устарел, отправляет запрос; запрос, который будет содержать значение сервера ETag в If-None-Match, и я также могу увидеть заголовок If-Modified-Since.

Вообще говоря, Firefox не перепродает или не проверяет кешированные файлы, которые еще не истекли. Вы можете изменить поведение Firefox, на стороне клиента, изменив настройки в о: конфигурации (по-видимому, вам нужно очистить кэш и перезапустить Firefox для того, чтобы изменения вступили в силу):

browser.cache.check_doc_frequency (по умолчанию после истечения срока) browser.cache.check_doc_frequency not working? @ mozillaZine Forums (очистить кэш/перезапуск)

похоже, мой параметр check_doc_frequency установлен на 3, а это означает, что он должен проверить документы, только если они считаются как устареет.

Возможные значения и их эффекты

0 - Проверьте наличие новой версии страницы один раз за сеанс (а сессия начинается, когда первое окно приложения открывается и заканчивается, когда последнее окно приложения закрывается).
1 - Проверяйте новую версию каждый раз, когда загружается страница.
2 - Никогда не проверяйте новую версию - всегда загружайте страницу из кеша.
3 - Проверьте наличие новой версии, если страница устарела.(По умолчанию)

Одна вещь, которую я делаю, что я использую оба из следующих заголовков:

Cache-Control: max-age=3600 
Expires: Sun, Mar 27 2016 21:13:50 

Там может быть путаница какая-то, и если определяется только max-age, то вы работаете в какой-то странный сценарий и пропустить этот конкретный случай.

На всякий случай, есть мой полный заголовок:

Cache-Control: max-age=3600,public 
Connection: keep-alive, Keep-Alive 
Date: Mon, 28 Mar 2016 02:56:20 GMT 
Etag: 6b395ccb5b0a913f1828cce3e2756bdc 
Expires: Mon, 28 Mar 2016 03:56:19 GMT 
Keep-Alive: timeout=15, max=5 
Server: Apache 
Set-Cookie: ... 

Дубликат "Keep-Alive" в соединении происходит от Apache.