我怎么产生的一个ETag HTTP header资源的文件?

有帮助吗?

解决方案

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)

我建立了一串格式中的"文件的索引编号/戳/文件大小"。因此,如果一文件是在服务器上更改后,已提供给客户,新生etag不匹配的,如果客户重新请求。

char *mketag(char *s, struct stat *sb)
{
    sprintf(s, "%d/%d/%d", sb->st_ino, sb->st_mtime, sb->st_size);
    return s;
}

其他提示

只要它改变了只要资源表示的改变,你怎么产生这完全是你的了。

你应该试试生产方式,此外:

  1. 不需要你重新计算的每个有条件的获得,
  2. 不改变,如果资源的内容没有改变

使用的散列的内容可以使你失败#1如果不存储计算的散列沿用的文件。

使用索引的数字可能因为你失败#2如果你重新安排文件系统或者你的服务内容多个服务器。

一个机构,可以工作是用一些完全依赖于内容如SHA-1散列或一个版本字符串中,计算和储存一旦当你的资源内容的变化。

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

默认情况下,Apache和IIS嵌入数据在ETag,大大降低了赔率的有效性测试成功的网站上,与多个服务器。

...

如果你不把利用灵活的验证模型,Etag提供,最好只是删除ETag。

如何产生的默认apache etag在bash

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(浏览器的要求的文件只有当它改变了服务器上的),它从来没有工作过,我结束使用得到欺骗(增加一个时间戳作为一个获得参数js文件)。

我一直使用阿德勒-32作为一个html link缩短.我不确定这是否是一个很好的想法,但迄今为止,我还没有注意到任何重复。它可以工作为etag发电机。它应该是更加快速的然后试图散列使用加密方案喜欢沙,但是我还没有核实这一点。代码,我在使用的是:

 shortlink = str(hex(zlib.adler32(link)+(2**32-1)/2))[2:-1]

我会建议不使用它们,会对最近修改的标题代替。

Askapache有一个有用的文章。(作为他们做的相当多的一切似乎!)

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top