Web服务器如何确定ETag值是否为当前值?

时间:2019-06-20 22:42:14

标签: http server etag

示例场景

假设/some-view处有一个资源,该资源显示基于数据库查询的列表,例如

  • 项目1
  • 项目2
  • 项目3

客户端X向/some-view发出第一个请求,服务器处理响应,将其缓存,生成etag,然后将其发送回200。

现在已经过去了一段时间,/some-view上的列表还包含另一个项目

  • 项目1
  • 项目2
  • 项目3
  • 项目4

假设客户端X再次发送第一个请求,服务器将以304响应,直到另一个请求,例如客户端Y强制生成新的etag值,或者服务器是否实际处理响应并将其与当前etag进行比较以确定它是否仍然有效?也许不同的Web服务器对它的处理方式不同?

2 个答案:

答案 0 :(得分:1)

如果响应是动态生成的,则服务器实际上必须生成它才能生成ETag并将其与请求进行比较。如果它们匹配,则服务器可以避免发送响应,但它不能避免首先生成响应,至少在通常情况下(例如,ETag过滤器)不是这样,其中ETag只是响应的哈希。当然,ETag可以是任何东西,因此,在通常情况下,服务器必须生成响应,但是,如果您创建自己的ETag,则应在其中包含一些信息,服务器可以用来确定它是否可以返回304,而无需必须生成响应。

答案 1 :(得分:0)

ETag有2种情况:用于静态资源(文件)的ETag和用于动态查询结果的ETag(如所述)。

如果“ Web服务器”是指诸如Apache或Nginx之类的服务器软件,则它仅为静态资源提供ETag功能,而不会为动态结果自动生成或更新ETag。例如,根据Nginx document

  

语法:etag on |关闭;

     

默认:打开etag;

     

启用或禁用自动生成静态资源的“ ETag”响应标头字段。

原因是:Web服务器软件可以侦听文件更改并更新ETag,但无法确定数据库中的一堆数据是否被修改。

如果“ Web服务器”表示服务器端逻辑,则您可以自己生成和管理ETag(例如,URL及其对应的ETag的映射)。由于RFC7232的唯一要求是:

  

原始服务器应为任何选定的表示发送ETag      为此,可以合理且一致地检测到更改      确定

因此,这里的重点是“检测变化”-您可以选择最合适的解决方案:

  • 听写资源操作,并更新ETag。
  • 每5分钟在后台查询资源,并在发生更改后更新ETag。
  • 有问题的“客户Y”解决方案。
  • 有问题的“处理和比较”解决方案。
  • 更多...

只要该解决方案可以合理且一致地检测到更改,那将是一个很好的解决方案。