54

以下 HTTP 1.1 标头是什么意思?

如果无匹配:*

我在使用强或弱 ETag 甚至 ETag 列表时理解它,但我不明白它在使用星号 (*) 时的用途。

编辑:如果有一些伪代码(PHP 代码也很好)来显示如何/如何回答“If-None-Match:*”,那就太好了。

4

2 回答 2

44

答案是:视情况而定。

假设我们收到了

If-None-Match: *
If-Modified-Since: <yesterday date>

并且今天页面已更改。

首先,我们看一下*它告诉我们:“如果资源在那里并且满足条件(2),则返回 304”。很好,资源存在,但条件 (2) 指出:“仅返回 304,如果日期晚于当前日期”。所以这个条件不满足,页面就会被完全投递。

如果我们没有收到If-Modified-Since,则响应将是 304。

如果请求时资源不存在,我们将返回适当的代码(好像没有If-None-Match)。

304 应该只在 GET 和 HEAD 请求的响应中返回,并且所有与缓存相关的响应标头都必须存在。对于所有其他类型的请求,您的服务器需要回答 412(前提条件失败)。

我希望它有帮助;)

于 2010-01-29T19:57:09.230 回答
14

引用RFC 2616 (HTTP 1.1)

...如果给定“*”并且该资源存在任何当前实体,则服务器不得执行请求的方法,除非需要这样做,因为资源的修改日期与 If-Modified-Since 中提供的日期不匹配请求中的标头字段。

RFC 继续说,对于 GET 和 HEAD 请求,服务器不应执行请求,而应以 304(未修改)响应,而对于所有其他请求类型,它们应以 412(前提条件失败)响应。但这只是在服务器实际上具有所请求资源的某个版本的情况下。如果您没有任何实体,那么您应该处理请求(可能使用 404,因为您没有任何东西)。

要处理请求,首先要弄清楚如果该标头存在,服务器会做什么。如果该请求的结果不是2xx 或 304,则正常处理该请求。但如果请求的结果2xx 或 304,则处理 If-None-Modified 情况。当它是星时,则立即返回 304(除非被 If-Modified-Since 胜过)。如果是一个或多个实体标签,请检查这些标签中的任何一个是否与您计划用作响应的事物的标签匹配。如果有任何匹配,则返回 304;如果没有匹配,则照常提供。

稍后在 RFC 中,还有更多内容:

“If-None-Match: *”的含义是,如果源服务器(或缓存,可能使用 Vary 机制,请参阅第14.44节)选择的表示存在,则不得执行该方法,并且应该执行如果表示不存在。此功能旨在用于防止 PUT 操作之间的竞争。

也就是说,星号允许客户说,“如果该文件已经存在任何版本,请不要放置该文件。”

于 2010-01-21T18:42:32.113 回答