我最近遇到了ETag HTTP标头的概念。 (this)但是我仍然有一个问题,对于负责生成ETag的特定HTTP资源?

换句话说,它是实际的应用程序,容器(例如:Tomcat),Web服务器/负载平衡器(例如:Apache / Nginx)吗?

谁能帮忙吗?

最佳答案

与HTTP规范的大多数方面一样,最终的责任在于提供资源的人。

当然,通常使用我们的工具(服务器,负载平衡器,应用程序框架等)来帮助我们履行这些职责。但是,没有任何规范定义期望与应用程序相对应的“ Web服务器”提供的内容,这只是您所使用的工具中可用功能的实际问题。

现在,特别看一下ETags,常见的情况是可以将框架或Web服务器配置为自动对响应(正文或​​其他内容)进行哈希处理并将结果放入ETag中。然后,根据条件请求,它将生成响应并将其哈希以查看其是否已更改,如果没有,则自动发送条件响应。

举两个我熟悉的示例,nginx can do this在Web服务器级别使用静态文件,而Django can do this在应用程序级别使用动态响应。

这种方法很常见,易于配置,并且效果很好。但是,在某些情况下,它可能不是最适合您的用例的。例如:


要计算散列以与传入的ETag比较,您首先必须有一个响应。因此,尽管条件响应可以为您节省发送响应的开销,但不能节省生成响应的成本。因此,如果生成响应的成本很高,并且您有ETags的替代来源(例如,数据库中存储的版本号),则可以使用它来获得更好的性能。
如果打算使用ETagsprevent accidental overwrites with state-changing methods,则可能需要添加自己的应用程序代码,以使比较设置逻辑原子化。


因此,在某些情况下,您可能需要在应用程序级别创建ETags。再次以Django为例,它为您提供了一种简单的方法来provide your own function计算ETags

总之,为您控制的资源提供ETags最终是您的责任,但是您很可能可以利用软件堆栈中的工具为您完成此任务。

关于apache - 如何生成和配置ETag?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47512043/

10-11 07:58