HTTP If-None-Match与If-Match

时间:2010-01-28 19:01:12

标签: http caching header http-headers http-1.1

我目前正在构建一个PHP脚本,在需要时将回复HTTP“304 Not Modified”。

(见question #2086712到目前为止我做了什么)。

目前我回答以下问题:

  • 如果-Modified-Since的
  • 如果-无 - 匹配

但我发现另外3个标题可以触发“条件GET”(参见http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.3):

  • 如果-匹配
  • 如果未改性的-由于
  • 如果-范围

最后2对我的缓存系统来说似乎是不相干的(它们似乎在恢复“大”下载时使用)但我还没有发现“If-Match”是否可以在我的系统中使用。

“if-Match”是否在代理或Web浏览器中用于“常规”页面内容? “If-Match”如何与“If-None-Match”不同?

我应该支持那些3还是只支持其中的一些?欢迎任何帮助!

1 个答案:

答案 0 :(得分:37)

如果-匹配

如果出现以下情况,服务器必须返回412(Precondition Failed)响应:

  • 没有实体标签匹配,
  • 或“*”被给出,并且不存在当前实体

If-Match应忽略,如果:

  • 任何实体标签都匹配
  • 或者如果请求导致2xx或412状态以外的任何内容(没有If-Match)
  • 或者如果给出“*”并且资源的任何当前实体都存在

结论 if-match

  • “If-Match:*”的含义是,如果原始服务器选择的表示存在,则应执行该方法,如果表示不存在,则不得执行该方法。

If-Match in RFC2616

如果未改性的-由于

如果出现以下情况,服务器必须返回412(Precondition Failed)响应:

  • 自指定时间以来修改了所请求的变体

If-Unmodified-Since应忽略,如果

  • 自此字段中指定的时间以来未请求修改所请求的资源
  • 或通常的请求(即,没有If-Unmodified-Since标头)将导致除2xx或412状态以外的任何其他内容
  • 或指定的日期无效

If-Unmodified-Since in RFC2616

如果-范围

  

非正式地,它的意思是'如果实体没有变化,请将我遗漏的部分发给我;否则,请将整个新实体发送给我

前提条件:

  • If-Range标题应该只能与Range标题一起使用,如果请求 必须会被忽略>不包括 Range标题,或者服务器 不支持 子范围操作。
如果If-Range标头与实体的当前实体标签匹配,

服务器应该提供206(部分内容)响应。否则,服务器应该使用200(OK)响应返回整个实体。

If-Range in RFC2616

未定义的结果

具有以下标题组合会导致未定义的结果:

  • If-Modified-Since If-Match
  • If-Modified-Since If-Unmodified-Since
  • If-None-Match If-Match
  • If-None-Match If-Unmodified-Since

这些规则已从以下规则中分解出来(可在RFC2616中找到):

  • If-Match (If-None-Match If-Modified-Since)
  • If-Modified-Since (If-Match If-Unmodified-Since)
  • If-None-Match (If-Match If-Unmodified-Since)
  • If-Unmodified-Since (If-None-Match If-Modified-Since)
相关问题