如何为资源文件生成ETag HTTP头?
发布于 2008-08-07 08:57:38
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)我构建了一个格式为"datestamp-file size-file inode number“的字符串。因此,如果文件在发送给客户端后在服务器上发生了更改,则如果客户端重新请求该文件,则重新生成的etag将不匹配。
char *mketag(char *s, struct stat *sb)
{
sprintf(s, "%d-%d-%d", sb->st_mtime, sb->st_size, sb->st_ino);
return s;
}发布于 2008-08-09 13:50:18
只要它在资源表示发生变化时发生变化,那么如何生成它完全由您决定。
您应该尝试以一种额外的方式来生成它:
如果不将计算出的散列与文件一起存储,使用内容的散列可能会导致#1失败。
如果您重新排列文件系统或提供来自多个服务器的内容,则使用inode编号可能会导致第2处失败。
一种可行的机制是使用完全依赖于内容的东西,例如SHA-1散列或版本字符串,每当资源内容发生变化时计算并存储一次。
发布于 2008-08-07 10:13:20
来自http://developer.yahoo.com/performance/rules.html#etags
默认情况下,Apache和IIS都将数据嵌入到ETag中,这极大地降低了在具有多个服务器的网站上成功进行有效性测试的几率。
..。
如果您没有利用ETags提供的灵活的验证模型,最好是完全删除ETag。
https://stackoverflow.com/questions/4533
复制相似问题