ETag против заголовка истекает - PullRequest
351 голосов
/ 01 февраля 2009

Я огляделся, но не смог понять, следует ли мне использовать ETag и заголовок Expires или один или другой.

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

Я не хочу делать ничего особенного, например, изменять имя файла или помещать странные символы в конец URL, чтобы он не кэшировался.

Кроме того, есть ли что-то, что мне нужно сделать программно на моем конце в моих сценариях PHP, чтобы поддержать это, или это все Apache?

Ответы [ 8 ]

663 голосов
/ 01 февраля 2009

Они немного отличаются - у ETag нет никакой информации, которую клиент может использовать, чтобы определить, следует ли в будущем снова делать запрос на этот файл. Если ETag - это все, что у него есть, он всегда должен будет сделать запрос. Однако, когда сервер считывает ETag из запроса клиента, сервер может затем определить, следует ли отправить файл (HTTP 200) или сказать клиенту просто использовать свою локальную копию (HTTP 304). ETag - это просто контрольная сумма для файла, который семантически изменяется при изменении содержимого файла.

Заголовок Expires используется клиентом (и прокси-серверами / кэшами), чтобы определить, нужно ли ему вообще отправлять запрос серверу. Чем ближе вы находитесь к дате истечения срока действия, тем больше вероятность того, что клиент (или прокси-сервер) отправит HTTP-запрос на этот файл с сервера.

Поэтому на самом деле вы хотите использовать ОБА заголовки - установите для заголовка Expires разумное значение, основанное на частоте изменения содержимого. Затем настройте отправку ETag так, чтобы, когда клиенты отправляли запрос на сервер, он мог легче определить, следует ли отправлять файл обратно.

Последнее замечание об ETag - если вы используете настройку сервера с балансировкой нагрузки на нескольких машинах под управлением Apache, вы, вероятно, захотите отключить генерацию ETag. Это связано с тем, что inode используются как часть алгоритма хеширования ETag, который будет отличаться для разных серверов. Вы можете настроить Apache так, чтобы он не использовал inode в качестве части вычисления, но затем вы должны убедиться, что временные метки в файлах совпадают, чтобы обеспечить одинаковый ETag для всех серверов.

104 голосов
/ 14 октября 2011

Etag и Последние измененные заголовки валидаторы .

Они помогают браузеру и / или кешу (обратному прокси) понять, изменился ли файл / страница, даже если он сохранил то же имя.

Истекает и Контроль кэша дает Обновление информации .

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

Таким образом, вопрос, как правило, заключается в том, какой из валидаторов использовать, etag или последний измененный, и какой обновляемый заголовок информации использовать, срок действия или контроль кэша.

30 голосов
/ 04 марта 2014

Expires и Cache-Control являются "сильными заголовками кэширования"

Last-Modified и ETag являются "слабыми заголовками кэширования"

Сначала проверьте браузер Expires/Cache-Control, чтобы определить, следует ли делать запрос к серверу

Если необходимо сделать запрос, он отправит Last-Modified/ETag в запросе HTTP. Если значение документа Etag соответствует этому, сервер отправит код 304 вместо 200, а содержимое не будет. Браузер загрузит содержимое из своего кэша.

19 голосов
/ 01 февраля 2009

По умолчанию Apache сгенерирует Etag на основе номера индекса файла, даты последнего изменения и размера, что должно быть идеально для выполнения того, что вы хотите. Я думаю, что он также будет генерировать по умолчанию заголовок Last-Modified, основанный на времени последнего изменения файла на диске, что также прекрасно подходит для выполнения того, что вы хотите.

Возможно, вам также следует, чтобы Apache отправлял заголовок Expires, датированный одним годом в будущем (в соответствии с http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21), чтобы браузеры знали, что контент можно кэшировать. Посмотрите mod_expires для настройки что.

13 голосов
/ 17 июля 2014

Другое резюме:

Вы должны использовать оба. ETag - это информация «на стороне сервера». Срок действия - кэширование на стороне клиента.

  • Используйте ETag , за исключением случаев, когда у вас есть сервер с балансировкой нагрузки. Они безопасны и сообщат клиентам, что они должны получать новые версии файлов вашего сервера каждый раз, когда вы что-то меняете на своей стороне.

  • Срок действия следует использовать с осторожностью, так как если вы устанавливаете дату истечения срока давности в будущем, но хотите немедленно изменить один из файлов (например, файл JS), некоторые пользователи могут не получить модифицированную версию в течение длительного времени!

1 голос
/ 22 декабря 2016

На мой взгляд, с помощью заголовка Expire сервер может сообщить клиенту, когда мои данные будут устаревшими, в то время как с помощью Etag сервер будет проверять значение etag для клиента для каждого запроса.

1 голос
/ 14 октября 2016

Еще одна вещь, которую я хотел бы отметить, что некоторые из ответов, возможно, пропущены, - это недостаток наличия в заголовках как ETags, так и Expires/Cache-control.

В зависимости от ваших потребностей, он может просто добавить дополнительные байты в заголовки, что может увеличить пакеты, что означает дополнительные издержки TCP. Опять же, вы должны увидеть, необходимы ли накладные расходы на наличие обеих вещей в ваших заголовках, или это просто добавит дополнительный вес вашим запросам, что снизит производительность.

Вы можете узнать больше об этом в этом отличном сообщении в блоге Кайла Симпсона: http://calendar.perfplanet.com/2010/bloated-request-response-headers/

0 голосов
/ 11 января 2019

ETag используется, чтобы определить, должен ли ресурс использовать копию. и Expires Header, как Cache-Control, сообщается клиенту, что до десятилетий кэша клиент должен получить локальный ресурс.

На современных сайтах часто предлагают файл с именем hash, например app.98a3cf23.js, поэтому рекомендуется использовать Expires Header. Помимо этого, это также снижает стоимость сети.

Надеюсь, это поможет;)

...