if-modified-since和if-none-match之间可能有什么区别?我有一种感觉,if-none-match用于文件,而if-modified-since用于页面?
答案 0 :(得分:107)
关于Last-Modified/If-Modified-Since
和ETag/If-None-Match
之间的差异:
两者都可以互换使用。然而,取决于资源的类型,以及它在服务器上的生成方式,一个或另一个问题(“这已被修改,因为......?”/“这仍然匹配这个ETag?”)可能更容易回答
示例:
mtime
作为Last-Modified
日期是最简单的解决方案。ETag
将更容易
OTOH,这意味着你仍然必须在服务器上生成整个页面,即使是有条件的GET。找出究竟要进入ETag的内容(主键,修订号,......等)可以为您节省大量时间。有关该主题的更多详细信息,请参阅以下链接:
答案 1 :(得分:22)
If-Modified-Since
与Last-Modified
进行比较,而If-None-Match
则与ETag
进行比较。 Modified-Since
和ETag
都可用于标识资源的特定变体。
但If-Modified-Since
与Last-Modified
的比较可为您提供缓存变体较旧或较新的信息,而If-None-Match
的比较1}}到ETag
只是为您提供是否相同的信息。此外,大多数ETag
生成器都包含特定于系统inode的信息,因此将文件移动到其他驱动器也可能会更改ETag
。
答案 2 :(得分:13)
Last-Modified / If-Modified-Since中使用的时间戳值具有有限的精度 - 一秒钟,这对于快速更改的内容来说是不够的,例如,可以在其中发布多个消息的Web聊天应用程序任何给定的秒。 ETag / If-None-Match可以帮助解决这个问题。
答案 3 :(得分:8)
正如谷歌的最佳做法所述:
为所有可缓存资源指定Expires或Cache-Control max-age以及Last-Modified或ETag之一非常重要。指定Expires和Cache-Control:max-age或指定Last-Modified和ETag都是多余的。
https://developers.google.com/speed/docs/best-practices/caching
答案 4 :(得分:5)
If-Modified-Since使用日期,而If-None-Match使用ETag。它们都可以用于“页面”(即HTML)和其他文件。
答案 5 :(得分:3)
除非服务器声明为弱,否则ETag被认为是强验证器,因此可用于满足条件范围请求。但是,大多数自动生成的ETag在服务器场情况下都存在困难,因为它们经常使用inode信息和/或唯一的持久计数器。在实践中,我发现Last Modified标头足以用于相当静态的内容,例如提供受保护的静态内容,因为文件的写入时间是一个相当好的验证器。
ETag是迄今为止最灵活的。符合条件的客户需要在条件请求中发送ETag,而如果可用,他们应该发送两者。
答案 6 :(得分:0)
If-Modified-Since标头用于指定浏览器上次接收请求的资源的时间。 If-None-Match标头用于指定服务器上次收到请求资源时所发出的实体标签。
在上述两种方式中,这些标头用于支持浏览器中内容的缓存,并使服务器能够指示浏览器使用资源的缓存副本,而不用响应资源的全部内容如果不需要的话。