Как долго мы должны устанавливать заголовок HTTP Expires или Cache-control: max-age?

Допустим, если bundle.js составляет 750 КБ, правда ли, что если вы установите для него значение «никогда не истекает» или «срок действия истекает через 10 лет», тогда браузеру не нужно извлекать этот файл и, следовательно, он может ускорить ваш сайт и загрузку страниц?

(Кстати, сказано, что Cache-control: max-age — это HTTP/1.1 и если присутствуют и он, и Expires:, Cache-control переопределяет заголовок Expires.)

Что делать, если у вас еженедельный или двухмесячный цикл выпуска, следует ли установить для заголовка Expires значение 1 неделя или 2 месяца? Я подумал, что при еженедельном цикле выпуска некоторые из ваших файлов JavaScript или CSS могут остаться прежними, поэтому может быть хорошо просто установить срок их действия через 6 месяцев или даже 10 лет? (потому что через неделю он не изменился?)

Но что, если ваш файл изменился, но браузер его не извлекает? Правда ли, что если вы используете механизм ETag или если вы используете bundle.53ae823.js или bundle.2020-03-12-08.js, то вы можете "заставить" его истечь, если ETag отличается или имя файла отличается? Как правильно установить длину заголовка Expires?


person nonopolarity    schedule 13.03.2020    source источник


Ответы (1)


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

Затем вы можете установить Cache-control: max-age на 31536000 (год, максимум), потому что вы можете доверять файлу с URI, чтобы он не изменился (из-за хеша, если файл изменится, URI тоже изменится).

И, конечно же, вы можете реализовать ETAG, чтобы включить повторную проверку кеша. Это по-прежнему потребует отправки запроса на ваш сервер/CDN, но избавит пользователя от необходимости загружать весь файл, если он не изменился.

На эту тему есть хорошая статья здесь.

person mcmd    schedule 26.05.2020