Я запускаю PHP на Apache и смущен тем, как реализовать кеширование на стороне сервера, чтобы ускорить загрузку сайта.
В чем разница между заголовками Expires
, Last-Modified
и ETag
, и какой из них следует использовать в какой ситуации?
Я запускаю PHP на Apache и смущен тем, как реализовать кеширование на стороне сервера, чтобы ускорить загрузку сайта.
В чем разница между заголовками Expires
, Last-Modified
и ETag
, и какой из них следует использовать в какой ситуации?
Вы можете использовать заголовок Expires
совместно, но независимо от двух других. Он универсально поддерживается прокси-серверами и кешами браузера.
Разница между отметками ETag
и Last-Modified
больше семантична. ETags непрозрачны для клиентов. Обычно это контрольная сумма. В то время как заголовок Last-Modified может интерпретироваться клиентами. Он понял, что последняя измененная метка времени работает линейно.
Если браузер запрашивает ресурс с If-Unmodified-Since
, тогда такой диапазон может совпадать с широким диапазоном временных меток. Если ваши страницы часто меняются, тогда может быть полезно временная метка Last-Modified.
Подход ETag, с другой стороны, приводит к клиентам, которые сохраняют один последний отпечаток на ресурс. (Я не уверен, что кеши браузера запоминают несколько ETags). По запросам перечислены только один или несколько возможных токенов If-None-Match
. Это может означать больше промахов. Кроме того, вам нужно сравнить несколько контрольных сумм, тогда как с временной отметкой Last-Modified вы можете провести арифметическое сравнение.
Настоящим преимуществом ETags является то, что вы можете надежно сравнить отпечатки пальцев. Временные метки Last-Modified немного более расплывчаты, поскольку они не проверяют, изменилось ли фактическое содержимое страницы.
См. также:
Expires
и Cache-Control
являются "сильными заголовками кеширования"
Last-Modified
и ETag
являются "слабыми заголовками кеширования"
Сначала браузер проверяет Expires/Cache-Control
, чтобы определить, следует ли запрашивать серверы.
Если он должен сделать запрос, он отправит Last-Modified/ETag
в HTTP-запрос. Если значение ETag
документа совпадает с этим, сервер отправит код 304 вместо 200 и не будет содержать контент. Браузер загрузит содержимое из своего кеша.
Я рекомендую использовать один из сильных заголовков кеширования вместе с одним из слабых заголовков кеширования.