【发布时间】:2014-10-08 22:21:18
【问题描述】:
我已经阅读RFC 2616 - sec14.26 和RFC 2616 - sec13.3.3 很长时间了,但我仍然不确定我是否理解正确。
第 14.26 节指出
如果任何实体标签与实体的实体标签相匹配,该实体标签将在对该资源的类似 GET 请求(没有 If-None-Match 标头)的响应中返回,或者如果给定“*”并且该资源存在任何当前实体,则服务器不得执行请求的方法,除非需要这样做,因为资源的修改日期无法匹配 If-Modified- 中提供的日期由于请求中的 header 字段。相反,如果请求方法是 GET 或 HEAD,服务器应该以 304 (Not Modified) 响应 进行响应,包括匹配的实体之一的缓存相关标头字段(特别是 ETag)。
,
如果没有一个实体标签匹配,那么服务器可以执行请求的方法,就好像 If-None-Match 头字段不存在一样,但也必须忽略任何 If-Modified-Since请求中的标头字段。也就是说,如果没有实体标签匹配,则服务器不得返回 304(未修改)响应。
第 13.3.3 节指出
HTTP/1.1 源服务器,在接收到包含 Last-Modified 日期(例如,在 If-Modified-Since 或 If-Unmodified-Since 标头字段中)和一个或多个实体标签(例如, 在 If-Match、If-None-Match 或 If-Range 标头字段中)作为缓存验证器,不得返回 304(未修改)的响应状态,除非这样做与所有条件标头一致请求中的字段。
我很困惑无条件兼容 HTTP 服务器是否应该响应客户端请求 (GET / HEAD) 其中
- 条件
If-Modified-Since匹配,但If-None-Match不匹配。 - 或者,条件
If-None-Match匹配,但If-Modified-Since不匹配。
根据第 14.26 节,第一种情况应返回 304 Not Modified,第二种情况应返回 200 OK,因为 If-Modified-Since 被忽略。
但是第 13.3.3 节说 “它不得返回 304(未修改)的响应状态,除非这样做与请求中的所有条件标头字段一致。”,这意味着在这两种情况下都应该返回 200 OK。
【问题讨论】:
-
RFC 2616 已过时。请改为查看greenbytes.de/tech/webdav/rfc7232.html。
标签: http http-headers