HTTP头是什么If-None-Match:*是什么意思?

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

If-None-Match:*

我使用强或弱的ETag,甚至是ETag的列表,我都明白这一点,但是我不明白它在使用星号(*)时的用处。

编辑:将很高兴有一些伪代码(PHP代码也不错),将显示如何/如何回答“如果无匹配:*”。

答案是:这取决于。

假设我们收到了

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

这个页面今天已经被修改

首先,我们看一下* ,它告诉我们:“如果资源在那里,则返回304,满足条件(2)”。 好,资源存在,BUT条件(2)规定:“只返回304,如果date晚于当前”。 所以这个条件没有被满足,页面将被完全传递。

如果我们没有收到If-Modified-Since ,那么回应是304。

如果资源不存在请求,我们会返回相应的代码(就像没有If-None-Match )。

304只能在GET和HEAD请求的响应中返回,并且所有与caching相关的响应头都必须在那里。 对于所有其他types的请求你的服务器需要回答412(先决条件失败)。

我希望它有帮助;)

从RFC 2616(HTTP 1.1)引用:

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

RFC继续说,不是执行请求,服务器应该对GET和HEAD请求做出响应(不做修改),对于所有其他的请求types,它们应该以412(先决条件失败)做出响应。 但是,只有当服务器实际上具有某个版本的请求的资源。 如果你没有任何实体,那么你应该处理这个请求(可能是404,因为你没有任何东西)。

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

后来在RFC中,还有更多的:

“If-None-Match:*”的含义是,如果原始服务器(或caching,可能使用Vary机制,见14.44节)select的表示存在并且应该执行,那么方法不能被执行如果表示不存在。 此function旨在防止PUT操作之间的竞争。

也就是说,明星允许客户说:“如果这个文件的版本已经存在,请不要把这个文件放进去。”