假设/some-view
处有一个资源,该资源显示基于数据库查询的列表,例如
客户端X向/some-view
发出第一个请求,服务器处理响应,将其缓存,生成etag,然后将其发送回200。
现在已经过去了一段时间,/some-view
上的列表还包含另一个项目
假设客户端X再次发送第一个请求,服务器将以304响应,直到另一个请求,例如客户端Y强制生成新的etag值,或者服务器是否实际处理响应并将其与当前etag进行比较以确定它是否仍然有效?也许不同的Web服务器对它的处理方式不同?
答案 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 为此,可以合理且一致地检测到更改 确定
因此,这里的重点是“检测变化”-您可以选择最合适的解决方案:
只要该解决方案可以合理且一致地检测到更改,那将是一个很好的解决方案。