如何制作一个与 Apache 相匹配的 etag?

发布于 2024-07-04 23:24:22 字数 58 浏览 11 评论 0原文

我想制作一个与 Apache 生成的内容相匹配的 etag。 apache 如何创建它的 etag?

I want to make an etag that matches what Apache produces. How does apache create it's etags?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

世态炎凉 2024-07-11 23:24:22

关于 Apache 的 Etag,需要记住的一件事是它们在集群中表现不佳,因为它们包含的 inode 信息可能(而且可能会)在同一集群中的机器之间有所不同。

One thing to remember about Apache's Etags is that they don't play well in clusters because they include inode information that can—and probably will—vary between machines in the same cluster.

放肆 2024-07-11 23:24:22

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)));

Apache uses the standard format of inode-filesize-mtime. The only caveat to this is that the mtime must be epoch time and padded with zeros so it is 16 digits. Here is how to do it in PHP:

$fs = stat($file);
header("Etag: ".sprintf('"%x-%x-%s"', $fs['ino'], $fs['size'],base_convert(str_pad($fs['mtime'],16,"0"),10,16)));
撑一把青伞 2024-07-11 23:24:22

上面的答案(来自 Chris)效果很好,但可以使用 sprintf 中的隐式转换进行简化:

sprintf('"%x-%x-%x"', $s['ino'], $s['size'], str_pad($s['mtime'], 16, "0"));

建议的 %016x 不起作用,因为填充是在转换为十六进制之后应用的,而不是前。

the answer above (from Chris) works well, but can be simplified using an implicit cast in the sprintf:

sprintf('"%x-%x-%x"', $s['ino'], $s['size'], str_pad($s['mtime'], 16, "0"));

The suggested %016x doesn't work because the padding is applied after the conversion to hex, rather than before.

墨落成白 2024-07-11 23:24:22

如果您动态生成页面,这可能没有意义。 如果您使用 PHP,您可以选择主脚本的 inode 和文件大小,但修改时间不会告诉您数据是否已更改。 除非您有良好的缓存过程或只是生成静态页面,否则 etag 没有帮助。 如果您确实有良好的缓存过程,则索引节点和文件大小可能无关紧要。

编辑:对于那些不知道 etag 是什么的人 - 他们只是应该知道是一个在内容更改时更改的值,用于缓存目的。 浏览器从 Web 服务器获取 etag,将其与缓存副本的 etag 进行比较,如果 etag 发生更改,则获取整个页面。

If you're dynamically generating your page though, this probably won't make sense. If you're in PHP, you can pick the inode and file size of the main script, but the modify time won't tell you if your data has changed. Unless you have a good caching process or just generate static pages, etags aren't helpful. If you do have a good caching process, the inode and file size are probably irrelevant.

Edit: For people who don't know what etags are - they're just supposed to be a value that changes when the content has changed, for caching purposes. The browser gets the etag from the web server, compares it to the etag for its cached copy and then fetches the whole page if the etag has changed.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文