Правильный стандартный заголовок http для сайта, который часто обновляется
Согласно документации Yahoo YSLOW и интернету, в нем говорится, что мне нужно иметь его там, где обслуживаемые веб-документы должны истечь по крайней мере через 49 часов, чтобы он имел хороший балл в тесте скорости. Я кэширую как документы, так и изображения на сайте для оптимальной производительности. Проблема в том, что при обновлении контента некоторые браузеры корректно перезагружают изображения, в то время как другие браузеры используют старый устаревший контент. Немедленное исправление - это обязательное использование кнопки обновления, но я хочу, чтобы пользователи не использовали ее.
Это моя настройка заголовка до сих пор. Я написал это на PHP. Если вы не понимаете PHP, просто игнорируйте "header(" и ",true".
header("ETag: \"".md5(time())."\"",true);
header('Last-Modified: '.gmdate('D, d M Y H:i:s',time() - 3600).' GMT',true);
header('Expires: '.gmdate('D, d M Y H:i:s',time()+(3600*24*7)).' GMT',true);
header('Cache-control: max-age:'.(3600*24*7).', public',true);
header("Age: 0",true);
header("Connection: close",true);
По сути, я установил срок действия документа через неделю, и я хочу это изменить.
В любом случае.... Я спрашиваю о том, как создать правильный набор заголовков таким образом, чтобы пользователям не приходилось принудительно перезагружать страницу из-за их браузера (я полагаю, Firefox), и я также Я хочу соответствовать требованиям Google Pagespeed и стандартам YSLOW от Yahoo.
Есть идеи?
РЕДАКТИРОВАТЬ: я забыл добавить, что веб-сайт обновляется два-пять раз в неделю, где большинство обновлений происходит в выходные дни.
1 ответ
Смысл установки заголовков управления кэшем с большим сроком действия заключается в том, чтобы браузер дольше использовал старые ответы вместо частой проверки на сервере. Если вы хотите, чтобы браузер часто проверял наличие нового контента, вы не можете указать длительное время жизни кэша; оба диаметрально противоположны.
Что вы можете сделать, однако, это указать длительное время жизни кеша для вещей, которые не часто меняются и не должны сразу просматриваться браузером, таких как скрипты и таблицы стилей, сохраняя при этом время жизни кеша коротким для часто обновляемого контента, В браузере можно регулярно проверять наличие обновленных изображений, но, например, проверять наличие новых сценариев и таблиц стилей можно только один раз в неделю.
Кроме того, даже для часто меняющегося контента, такого как ваши изображения, и особенно для больших файлов, таких как изображения, вы захотите поддерживать условные запросы, чтобы браузер мог избежать повторной загрузки контента ресурсов, которые на самом деле не изменились. Способ сделать это:
- Обеспечить правильное
ETag
а такжеLast-Modified
Заголовки, представляющие текущее состояние ресурса, в ваших HTTP-ответах. - На основе этих заголовков ответа браузер может включать
If-None-Match
а такжеIf-Modified-Since
Заголовки в будущих запросах на тот же ресурс. - Сервер может проверить эти заголовки запроса и отправить ответ 304 Not Modified, если они соответствуют текущему состоянию ресурса; это говорит браузеру, что его кэшированная копия все еще действительна. Если заголовки не совпадают - это означает, что ресурс изменился - отправьте новую версию ресурса вместе с новой
ETag
а такжеLast-Modified
заголовки.
Вы сейчас отправляете ETag
а также Last-Modified
Заголовки в ваших ответах, но они бесполезны, потому что они основаны на текущем системном времени, которое постоянно меняется. С точки зрения управления кэшем, файл, похоже, "меняется" каждую секунду (когда возвращаемое значение time()
изменения). Ваш Last-Modified
заголовок должен быть меткой времени изменения файла, а ваш ETag
должно быть что-то вроде хеша его содержимого.