我正在编写一种资源处理方法,用于控制对不同文件的访问,并且我想利用浏览器的缓存。我的问题有两个:
为了确定是否应发送304响应以及在检查它们时我要查找什么,我需要检查哪些是确定性的HTTP标头?
此外,当我最初发送文件(如200响应)时,是否需要发送任何标头(如“Last-Modified”)?
一些伪代码可能是最有用的答案。
缓存控制标头呢?其各种可能的值是否会影响发送给客户端的内容(特别是max-age),还是只需遵守if-modified-since标头即可?
我正在编写一种资源处理方法,用于控制对不同文件的访问,并且我想利用浏览器的缓存。我的问题有两个:
为了确定是否应发送304响应以及在检查它们时我要查找什么,我需要检查哪些是确定性的HTTP标头?
此外,当我最初发送文件(如200响应)时,是否需要发送任何标头(如“Last-Modified”)?
一些伪代码可能是最有用的答案。
缓存控制标头呢?其各种可能的值是否会影响发送给客户端的内容(特别是max-age),还是只需遵守if-modified-since标头即可?
如果您需要关于ETag生成的帮助,请发另一个问题,我会找出一些代码并提供帮助。希望对您有所帮助!
ETag
标头的客户端?它只应该在响应中使用。此外,根据规范,它应该始终被引用。 - Matt KantorIf-None-Match
/If-Match
头中包含它的 etag(s)。我从未见过 UA 在请求中发送 ETag: "..."
头,你见过吗? - Matt Kantor一个304未修改的响应可以由带有If-Modified-Since(“IMS”)或If-Not-Match(“INM”)头的GET或HEAD请求导致。
为了决定在收到这些头文件时要做什么,想象一下您正在处理没有这些条件头的GET请求。确定在该响应中您的ETag和Last-Modified头的值,并使用它们来做出决策。希望您已经构建了系统,使得确定这一点比构建完整的响应更少成本。
如果存在INM并且该头的值与您将放置在ETag中的值相同,则响应304。
如果存在IMS并且该头中的日期值晚于您将放置在Last-Modified中的值,则响应304。
否则,请按照不包含这些头的请求进行处理。
对于第二部分问题的最小工作量方法,请确定您的Web应用程序中可以轻松正确生成哪些(Expires,ETag和Last-Modified)头文件。
建议阅读材料:
关于缓存控制:
在提供服务时,您不必担心缓存控制,除了将其设置为合理的值。基本上它告诉浏览器和其他下游实体(如代理)在缓存超时前应经过的最长时间。