Как создать заголовок ETag HTTP для файла ресурсов?
HTTP: создание заголовка ETag
Ответ 1
. Etag - это произвольная строка, которую сервер отправляет клиенту, чтобы клиент отправил обратно серверу в следующий раз, когда запрашивается файл.
Etag должен быть вычислимым на сервере на основе файла. Похоже на контрольную сумму, но вы можете не захотеть проверять каждый файл, отправляющий его.
server client
<------------- request file foo
file foo etag: "xyz" -------->
<------------- request file foo
etag: "xyz" (what the server just sent)
(the etag is the same, so the server can send a 304)
Я создал строку в формате "номер файла inode/datestamp/размер файла". Таким образом, если файл был изменен на сервере после того, как он был отправлен клиенту, вновь восстановленный etag не будет соответствовать, если клиент повторно запросит его.
char *mketag(char *s, struct stat *sb) { sprintf(s, "%d/%d/%d", sb->st_ino, sb->st_mtime, sb->st_size); return s; }
Ответ 2
Пока он изменяется, когда изменяется представление ресурса, то, как вы его создаете, полностью зависит от вас.
Вы должны попытаться создать его так, чтобы:
- не требует повторного вычисления его на каждом условном GET и
- не изменяется, если содержимое ресурса не изменилось
Использование хэшей содержимого может привести к сбою в # 1, если вы не храните вычисленные хэши вместе с файлами.
Использование номеров inode может привести к сбою в # 2, если вы измените порядок вашей файловой системы или обслуживаете контент с нескольких серверов.
Одним из механизмов, который может работать, является использование чего-то полностью зависимого от содержимого, такого как хэш SHA-1 или строка версии, вычисленная и сохраненная один раз при изменении содержимого вашего ресурса.
Ответ 3
Из http://developer.yahoo.com/performance/rules.html#etags:
По умолчанию, как Apache, так и IIS внедряют данные в ETag, что значительно снижает вероятность проверки достоверности на веб-сайтах с несколькими серверами.
...
Если вы не пользуетесь гибкой моделью проверки, которую предоставляет ETags, лучше всего просто удалить ETag.
Ответ 4
Как сгенерировать по умолчанию apache etag в bash
for file in *; do printf "%x-%x-%x\t$file\n" `stat -c%i $file` `stat -c%s $file` $((`stat -c%Y $file`*1000000)) ; done
Даже когда я искал что-то вроде etag (браузер запрашивает файл, только если он изменился на сервере), он никогда не работал, и я закончил использовать трюк GET (добавив метку времени в качестве аргумента get файлы js).
Ответ 5
Я использую Adler-32 в качестве укороченного ссылки html. Я не уверен, что это хорошая идея, но до сих пор я не заметил никаких дубликатов. Он может работать как генератор этага. И он должен быть быстрее, чем пытаться использовать хэш, используя схему шифрования вроде sha, но я этого не проверял. Код, который я использую:
shortlink = str(hex(zlib.adler32(link)+(2**32-1)/2))[2:-1]
Ответ 6
Я бы порекомендовал не использовать их и вместо заголовков с последними изменениями.
У Askapache есть полезная статья об этом. (поскольку они делают почти все, что кажется!)