Заголовок ETag против истекает


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

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

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

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

7 342

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-это информация "на стороне сервера". Expires-это кэширование на стороне клиента.

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

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

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

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

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

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