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

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

7.08.2008 08:45:07
6 ОТВЕТОВ
РЕШЕНИЕ

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

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

 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);
    возврат с;
}
16
25.04.2014 22:44:32
Если mtime - это время последнего изменения файла, тогда каково значение размера и индекса?
Steve 4.02.2010 03:20:41
В моем случае это потому, что это был вычисленный путь из CGI-программы. Вы правы, что в случае прямого пути, что mtime, вероятно, будет достаточно. Так как стоимость в основном будет в stat (), нет никакой дополнительной платы за включение inode и размера, что может защитить от (весьма маловероятно, конечно) случая, когда мошеннический администратор может обновить файл и вернуться к нему, чтобы оригинал mtime.
Mark Harrison 4.02.2010 04:21:52
@MarkHarrison, зачем тебе двойные кавычки вокруг этага? Это обязательная часть синтаксиса?
Pacerier 18.07.2012 20:02:14

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

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

...

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

6
7.08.2008 10:13:20

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

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

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

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

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

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

18
9.08.2008 13:50:17

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

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

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

0
19.09.2008 22:31:32
Ссылка на Askapache не работает
bskinnersf 3.02.2010 18:43:54
Хм, это позор, надеюсь, они скоро вернутся, так как сайт стал золотым рудником советов!
Rich Bradshaw 3.02.2010 20:20:14
Ссылка вернулась.
Marius Gedminas 9.08.2010 16:13:42
@RichBradshaw просто вопрос, как мы можем узнать последнюю модифицированную временную метку ресурса? Это полностью ручная операция после прохождения истории изменений БД? Или есть какие-то автоматизированные способы?
Supun Wijerathne 28.11.2017 06:46:58

Как сгенерировать 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 ).

2
5.09.2011 12:38:09

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

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