2010-01-28 80 views
21

我目前正在构建一个PHP脚本,在需要时将回答HTTP“304 Not Modified”。HTTP If-None-Match vs. If-Match

(见question #2086712迄今我做什么)。

目前我回答以下几点:

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

但我发现,3个报头可以触发“条件GET “(见http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.3):

  • 的if-match
  • 如果未修饰的,由于
  • 如果-范围

最后2似乎irrevelent我的缓存系统(他们似乎正在恢复“大”下载时使用),但我没有,如果“发现如 - 匹配“可以在我的系统中使用。

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

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

回答

36

如果-比赛

服务器必须返回一个412(预处理失败)响应,如果:

  • 没有实体标签匹配,
  • 或 “*”,并给出没有电流实体存在

的if-match应该被忽略,如果:

  • 任何实体标签的匹配
  • 或者如果请求引起了一个2xx或412状态的其它任何东西(没有如果匹配)
  • 或者“*”,并给出任何当前实体存在的资源

结论是否匹配

  • 的意思是“如果 - 匹配:*”是,如果原始服务器选择的表示......存在应执行的方法,和一定不要执行该表示不存在。

If-Match in RFC2616

如果未改性的-由于

服务器必须返回一个412(前提条件失败)响应中,如果:

  • 所请求的变体已被自指定时间改性

如果未修饰的,因为应该被忽略,如果

  • 所请求的资源还没有被因为在该字段中指定
  • 或请求通常(即,没有如果未改性-Since头)被修改的时间会导致比一个2xx或412状态的任何其他
  • 或指定的日期无效

If-Unmodified-Since in RFC2616

如果-范围

通俗地说,它的意思是“如果实体不变,送我,我缺少的部分(S);否则,给我整个新实体”

前提条件:

  • If-RangeSHOULD只能用Range头一起使用,如果请求确实MUST被忽略不包括 a Range标头,或者如果服务器不支持子范围op关合作。

如果If-Range标头匹配实体的当前实体标签,服务器应该提供206(部分内容)响应。否则,服务器应当返回使用200(OK)响应整个实体。

If-Range in RFC2616

不确定的结果

有头的下面结合将导致未定义的结果:

  • 如果-Modified-Since的的if-match
  • 的If-Modified - 自如果 - 未修改 - 自从
  • 如果无 - 匹配的if-match
  • 如果 - 无 - 匹配如果未修饰的,由于

这些规则已经从下面的那些分解(可在RFC2616找到) :

  • 如果-匹配(如果-无 - 匹配如果-Modified-Since的)
  • 如果-Modifi ED-由于(如果 - 匹配如果未改性的-由于)
  • 如果-无 - 匹配(如果 - 匹配如果未改性的-由于)
  • 如果-Unmodified-由于(如果 - 无 - 匹配如果-Modified-Since的)
+4

有情况如果-匹配,如果未改性-Since或If-范围可以触发一个HTTP 304 “未修改”回答? – AlexV 2010-01-28 20:22:42

+5

不,它只允许使用'If-None-Match'和'If-Modified-Since'。 http://en.wikipedia.org/wiki/List_of_HTTP_headers – 2010-01-28 20:34:55

+0

太棒了,再次感谢您的光临! – AlexV 2010-01-28 21:00:21