HTTP:生成ETag标头

tag*_*s2k 24 language-agnostic etag webserver header http

如何为资源文件生成ETag HTTP标头?

Jus*_*ehy 17

只要资源表示发生变化,它就会发生变化,您生成它的方式完全取决于您.

您应该尝试以另外的方式生成它:

  1. 不要求你在每个条件GET上重新计算它,并且
  2. 如果资源内容未更改,则不会更改

如果不将计算的哈希值与文件一起存储,则使用内容哈希值会导致#1失败.

如果重新排列文件系统或从多个服务器提供内容,则使用inode编号可能会导致#2失败.

一种可以工作的机制是使用完全依赖于内容的东西,例如SHA-1哈希或版本字符串,每当资源内容发生变化时计算和存储一次.


Mar*_*son 16

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)
Run Code Online (Sandbox Code Playgroud)

我以"file inode number/datestamp/file size"格式构建了一个字符串.因此,如果在将服务器提供给客户端之后在服务器上更改了文件,则如果客户端重新请求它,则新重新生成的etag将不匹配.

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

  • 如果mtime是文件最后一次更改的时间,那么size和inode的目的是什么? (2认同)

gro*_*rom 6

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

默认情况下,Apache和IIS都在ETag中嵌入数据,这大大降低了在具有多个服务器的网站上成功进行有效性测试的几率.

...

如果您没有利用ETag提供的灵活验证模型,最好只删除ETag.