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

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

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

4b9b3361

Ответ 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 есть полезная статья об этом. (поскольку они делают почти все, что кажется!)

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