HTTP: создание заголовка ETag - PullRequest
       62

HTTP: создание заголовка ETag

24 голосов
/ 07 августа 2008

Как создать HTTP-заголовок ETag для файла ресурсов?

Ответы [ 6 ]

17 голосов
/ 09 августа 2008

Пока оно меняется всякий раз, когда изменяется представление ресурса, то, как вы его создаете, полностью зависит от вас.

Вы должны попытаться произвести его таким образом, чтобы:

  1. не требует пересчета при каждом условном GET, а
  2. не изменяется, если содержимое ресурса не изменилось

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

Использование номеров инодов может привести к сбою на # 2, если вы переставляете файловую систему или обслуживаете контент с нескольких серверов.

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

16 голосов
/ 07 августа 2008

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

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

 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)

Я собрал строку в формате «номер файла / даты / размер файла». Таким образом, если файл был изменен на сервере после того, как он был передан клиенту, вновь сгенерированный etag не будет совпадать, если клиент повторно запросит его.

char *mketag(char *s, struct stat *sb)
{
    sprintf(s, "%d/%d/%d", sb->st_ino, sb->st_mtime, sb->st_size);
    return s;
}
6 голосов
/ 07 августа 2008

С http://developer.yahoo.com/performance/rules.html#etags:

По умолчанию как Apache, так и IIS встраивают данные в ETag, что значительно снижает шансы на проверку достоверности на веб-сайтах с несколькими серверами.

...

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

2 голосов
/ 05 сентября 2011

Как создать etag apache по умолчанию в 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).

1 голос
/ 27 декабря 2012

Я использовал Adler-32 для сокращения ссылок на HTML. Я не уверен, что это хорошая идея, но пока я не заметил дубликатов. Может работать как генератор etag. И это должно быть быстрее, чем пытаться хэшировать, используя схему шифрования, такую ​​как sha, но я не проверял это Код, который я использую:

 shortlink = str(hex(zlib.adler32(link)+(2**32-1)/2))[2:-1]
0 голосов
/ 20 сентября 2008

Я бы порекомендовал не использовать их и использовать вместо них последние измененные заголовки.

У Askapache есть полезная статья на эту тему. (поскольку они делают почти все, что кажется!)

http://www.askapache.com/htaccess/apache-speed-etags.html

...