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操作之间的竞争。
也就是说,明星允许客户说:“如果这个文件的版本已经存在,请不要把这个文件放进去。”