Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

Итак, на самом деле то, что вы хотите сделать, это использовать ОБА заголовка - установите для заголовка Expires разумное значение, основанное на том, как часто меняется содержимое.Затем настройте ETags для отправки, чтобы, когда клиенты ДЕЙСТВИТЕЛЬНО отправляли запрос на сервер, ему было легче определить, следует ли отправлять файл обратно.

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

Другие советы

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

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

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

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

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

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_ истекает чтобы настроить это.

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top