首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HTTP:生成ETag报头

HTTP:生成ETag报头
EN

Stack Overflow用户
提问于 2008-08-07 08:45:07
回答 7查看 24.1K关注 0票数 27

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

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2008-08-07 08:57:38

etag是服务器发送给客户端的任意字符串,客户端将在下次请求文件时发送回服务器。

etag应该可以在服务器上根据文件进行计算。有点像校验和,但您可能不想对发送出去的每个文件进行校验和。

代码语言:javascript
复制
 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将不匹配。

代码语言:javascript
复制
char *mketag(char *s, struct stat *sb)
{
    sprintf(s, "%d-%d-%d", sb->st_mtime, sb->st_size, sb->st_ino);
    return s;
}
票数 17
EN

Stack Overflow用户

发布于 2008-08-09 13:50:18

只要它在资源表示发生变化时发生变化,那么如何生成它完全由您决定。

您应该尝试以一种额外的方式来生成它:

  1. 不要求您在每次条件GET时重新计算它,如果资源内容没有更改
  2. 也不会更改

如果不将计算出的散列与文件一起存储,使用内容的散列可能会导致#1失败。

如果您重新排列文件系统或提供来自多个服务器的内容,则使用inode编号可能会导致第2处失败。

一种可行的机制是使用完全依赖于内容的东西,例如SHA-1散列或版本字符串,每当资源内容发生变化时计算并存储一次。

票数 19
EN

Stack Overflow用户

发布于 2008-08-07 10:13:20

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

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

..。

如果您没有利用ETags提供的灵活的验证模型,最好是完全删除ETag。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档