Пользовательское поколение etag - PullRequest
8 голосов
/ 10 августа 2011

Как я могу настроить сервер apache или nginx для отправки заголовков Etag, используя алгоритм по моему выбору (то есть не включая inode, mtime или size)? Есть ли альтернатива компиляции нового модуля C?

Ответы [ 2 ]

5 голосов
/ 06 апреля 2013

В Apache ETag обрабатываются как основная функция . ETag вычисляется как хэш нескольких значений. Вы можете использовать директиву FileETag в вашем файле httpd.conf или .htaccess, чтобы определить условное поведение для значений, которые нужно включить в хеш, но, как вы указали, ваши параметры ограничены:

  • INode - номер i-узла вашего файла на конкретном сервере, с которого он обслуживается
  • MTime - временная метка (в миллис) сервера, с которого ваш файл обслуживается
  • Size - размер вашего файла в байтах
  • All - все вышеперечисленное
  • None - ничего из вышеперечисленного

Если вы хотите по-настоящему настраиваемое поколение ETag, вам лучше всего написать модуль Apache. Однако, если вам нужно быстрое и грязное исправление, вы можете сгенерировать свои собственные теги, перенаправив свои запросы в скрипт PHP и добавив в скрипт заголовок Etag. Маршрут может выглядеть следующим образом в вашем файле httpd.conf или .htaccess:

RewriteCond %{REQUEST_FILENAME} \.png$     # This example looks for .png requests
RewriteRule ^(.*)$ /gentag.php?path=$1 [B] # ...and routes them to a PHP script

PHP-скрипт может выглядеть так:

<?
    $path = $_GET['path'];  // Grab the filepath from GET params
    $cont = file_get_contents($path);  // Get file contents to hash
    $hash = crc32($cont);   // Create your own ETag hash however you like
    header("Etag: $hash");  // Send the custom Etag header
    echo $cont;             // Dump the file contents to output
?>
0 голосов
/ 26 декабря 2018

В этом PR есть некоторые комментарии, которые могут помочь вам найти то, что вы ищете. Это не алгоритм по вашему выбору, но это MD5, что довольно солидно.

Вы заметите, что они представляют два варианта.

  1. Используйте дату изменения файла, но процесс сборки искусственно изменяет дату изменения файла на основе хеша файла. Затем эту модифицированную дату можно включить в вычисление заголовка ETag (не используйте ее в качестве заголовка Last-Modified, как это может быть в будущем).
  2. Используйте функцию Content Digest в Apache, чтобы получить MD5-хэш файла в качестве заголовка. Затем вы можете манипулировать этим по мере необходимости.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...