Срок действия заголовка ETag vs истекает

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

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

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

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

7 ответов


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

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

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

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


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

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

истекает и Cache-control дают обновить информацию.

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

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


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

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

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

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


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

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


еще одно резюме:

вам нужно использовать оба. ETags-это информация "на стороне сервера". Истекает срок действия кэширования "на стороне клиента".

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

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


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

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

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


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