我想创建一个与Apache产生的匹配的etag。 apache如何创建它的etags?
答案 0 :(得分:9)
Apache使用inode-filesize-mtime的标准格式。唯一需要注意的是mtime必须是纪元时间并用零填充,所以它是16位数。以下是如何在PHP中执行此操作:
$fs = stat($file);
header("Etag: ".sprintf('"%x-%x-%s"', $fs['ino'], $fs['size'],base_convert(str_pad($fs['mtime'],16,"0"),10,16)));
答案 1 :(得分:2)
关于Apache的Etags需要记住的一点是,它们在集群中不能很好地运行,因为它们包含的inode信息可能 - 并且可能会在同一集群中的机器之间变化。
答案 2 :(得分:1)
如果你动态生成你的页面,这可能没有意义。如果您使用的是PHP,则可以选择主脚本的inode和文件大小,但修改时间不会告诉您数据是否已更改。除非你有一个好的缓存过程或只是生成静态页面,否则etags没有帮助。如果你有一个很好的缓存过程,inode和文件大小可能是无关紧要的。
编辑:对于那些不知道etag是什么的人 - 他们只是应该是一个在内容发生变化时更改的值,用于缓存目的。浏览器从Web服务器获取etag,将其与其缓存副本的etag进行比较,然后在etag发生更改时获取整个页面。
答案 3 :(得分:1)
上面的答案(来自Chris)运作良好,但可以使用sprintf中的隐式强制转换进行简化:
sprintf('"%x-%x-%x"', $s['ino'], $s['size'], str_pad($s['mtime'], 16, "0"));
建议的%016x
不起作用,因为填充是在转换为十六进制之后而不是之前应用的。