Apache2 自定义etag生成

Apache2 自定义etag生成,apache2,nginx,Apache2,Nginx,如何配置apache或nginx服务器以使用我选择的算法(即不涉及inode、mtime或size)发送Etag头?除了编译新的C模块,还有其他选择吗?在Apache中。ETag计算为多个值的散列。您可以在httpd.conf或.htaccess文件中使用filetag指令定义要在哈希中包含哪些值的条件行为,但正如您所指出的,您的选项仅限于: INode-您的文件在其服务的特定服务器上的i节点号 MTime-从中提供文件的服务器的时间戳(以毫秒为单位) Size-文件的大小(以字节为单位) 全

如何配置apache或nginx服务器以使用我选择的算法(即不涉及inode、mtime或size)发送Etag头?除了编译新的C模块,还有其他选择吗?

在Apache中。ETag计算为多个值的散列。您可以在
httpd.conf
.htaccess
文件中使用
filetag
指令定义要在哈希中包含哪些值的条件行为,但正如您所指出的,您的选项仅限于:

  • INode
    -您的文件在其服务的特定服务器上的i节点号
  • MTime
    -从中提供文件的服务器的时间戳(以毫秒为单位)
  • Size
    -文件的大小(以字节为单位)
  • 全部
    以上所有内容
  • -上述各项均无
如果您想要真正定制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
?>

公共关系中有一些评论可以说明你在寻找什么。它不是您选择的算法,但它是MD5,它非常可靠

您会注意到,它们提供了两个选项

  • 使用文件的修改日期,但让生成过程基于文件的哈希人为地修改文件的修改日期。然后,此修改日期可以包含在
    ETag
    标题计算中(不要将其用作上次修改的
    标题,因为它可能在将来)
  • 使用Apache的特性获取文件的MD5哈希作为头。然后,您可以根据需要对其进行操作

  • 当您需要为静态文件设置自己的
    ETag
    时,您是否有一个用例?从集群提供的服务-inode和mtime对于相同的版本不会相同,对于不同的版本大小可能相同nginx有内置的Perl,这似乎是一个很好的工作。在远程资源(如数据库)没有锁定的情况下,它工作得非常好(可靠且快速)。