HTTP: Генерация ETag заголовок

голоса
24

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

Задан 07/08/2008 в 09:45
источник пользователем
На других языках...                            


6 ответов

голоса
17

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

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

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

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

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

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

Ответил 09/08/2008 в 14:50
источник пользователем

голоса
16

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)

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

символ * mketag (символ * s, структура стат * С.Б.)
{
    Sprintf (с, "% d /% d /% d", sb-> st_ino, sb-> st_mtime, sb-> st_size);
    вернуться с;
}
Ответил 07/08/2008 в 09:57
источник пользователем

голоса
6

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

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

...

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

Ответил 07/08/2008 в 11:13
источник пользователем

голоса
2

Как создать апачские по умолчанию ETag в Баше

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 трюка (добавление метки в качестве ПОЛУЧИТЬ аргумент файлов JS ).

Ответил 05/09/2011 в 13:38
источник пользователем

голоса
1

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

 shortlink = str(hex(zlib.adler32(link)+(2**32-1)/2))[2:-1]
Ответил 27/12/2012 в 16:58
источник пользователем

голоса
0

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

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

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

Ответил 19/09/2008 в 23:31
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more