ETag vs Header Expires

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

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

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

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

Ответ 1

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

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

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

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

Ответ 2

Etag и Last-modified заголовки валидаторы.

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

Истекает, а Cache-control предоставляет информацию об обновлении.

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

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

Ответ 3

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

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

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

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

Ответ 4

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

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

Ответ 5

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

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

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

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

Ответ 6

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

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

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

Ответ 7

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

Ответ 8

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

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

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