Подтвердить что ты не робот

Какой лучший способ создать etag?

Какой хороший способ программно генерировать etag для веб-страниц, и рекомендуется ли эта практика? Некоторые сайты рекомендуют отключать etags, другие рекомендуют производить их вручную, а некоторые рекомендуют оставить активные настройки по умолчанию активными - что лучший способ здесь?

4b9b3361

Ответ 1

ETags помогают, когда вы используете какой-то механизм кеширования перед вашим веб-генератором. Браузеры сами не используют их, они слушают "(если) изменены с" или "возрастных заголовков, afaik.

В любом случае, из-за его простого характера, нет проблем с предоставлением http-заголовка с ETag. Я слышал, что многие веб-серверы просто берут расположение файла и временную метку файла и делают md5-хэш по этим данным.

Мы, например, создали простой, но эффективный etag с нашим программным обеспечением. Каждая "единица контента" (то есть html, jpegs, gifs...) в нашем программном обеспечении имеет уникальный идентификатор и номер версии (т.е. jpeg имеет идентификатор "17" и версию "2", это означает, что он был изменен один раз), Таким образом, ETag просто является строкой "id-версия", здесь: "17-2". При следующем изменении это будет "17-3", так что cacher распознает изменение, полностью загружает новую часть контента (один раз) и сохраняет ее в своем собственном кеше.

Но вы, вероятно, могли бы использовать URL и временную метку (т.е. временную метку файла).

Ответ 2

Я рекомендую генерировать хэш содержимого, например. md5($content).
Кроме того, чтобы предотвратить хеш-коллизию, вы можете добавить, например. идентификатор элемента содержимого к нему (если это подходит).

Ответ 3

Хорошо ETags имеют смысл, когда вы сильно полагаетесь на кеширование. Они являются отличным индикатором состояния ресурса (например, URL-адреса).

Например, скажем, вы используете запрос ajax, чтобы вытащить последние комментарии пользователя, и вы хотите узнать, есть ли какие-либо новые комментарии. Изменение ETag для предупреждения вашего приложения о новом контенте является менее дорогостоящим способом проверить это.

Потому что, если ETag тот же, вы можете сохранить свой кеш, но в противном случае перестроить его.

ETags также имеют большой смысл с API RESTful.

Что касается его генерации, глядя на spec, я думаю, вы можете делать почти все, что захотите. Временная метка, хэш, что имеет смысл для вас/вашего приложения.

Ответ 4

Я только что выпустил YSlow, и он пожаловался на Etags, поэтому я сделал небольшое исследование. Проблема, согласно Yahoo blog (см. Комментарии тоже) заключается в том, что в реализациях ETags по умолчанию используется номер файла inode или номер версии ntfs или soemthing else, равно как и сервер, как часть хэша. Это, будучи быстрым, в основном препятствует тому, чтобы один и тот же файл обслуживался двумя разными серверами из одного и того же файла, и закручивал как браузеры, так и нисходящие кеши или балансы нагрузки.

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

Для себя, так как я в простой среде, где временная метка файла будет более чем достаточной, я просто отключил их в Apache, используя FileETag none в моем файле .htaccess. Это закрывает YSlow и должно заставить вещи вернуться к последней измененной дате в файле.

Ответ 5

Муфаса,

Yahoo (и YSlow) фактически поощряют их использование, но с предостережением, что автоматически генерируемые ETags будут отличаться от сервера к серверу.

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

Ответ 6

Как правило, "сайты", которые препятствуют их использованию, - это Yahoo, и потому, что некоторые веб-серверы по умолчанию не создают автоматически ETAG, которые работают в фермах серверов. (Что является правильным и точным для Yahoo, чтобы требовать.)

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