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

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

6 ответов


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)

Я создал строку в формате "file inode number / datestamp / file size". Итак, если файл изменен на сервере после того, как он был обслужен для клиента вновь регенерированный etag не будет соответствовать, если клиент повторно запросит его.

char *mketag(char *s, struct stat *sb)
{
    sprintf(s, "%d/%d/%d", sb->st_ino, sb->st_mtime, sb->st_size);
    return s;
}

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

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

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

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

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

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


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

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

...

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


Как создать 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 trick (добавление метки времени в качестве аргумента get в JS-файлы).


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

 shortlink = str(hex(zlib.adler32(link)+(2**32-1)/2))[2:-1]

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

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

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