以下HTTP 1.1标头是什么意思?
If-None-Match:*
我在使用强弱或弱ETag甚至是ETag列表时理解它,但我不明白它在使用星号(*)时的用法。
编辑很高兴有一些伪代码(PHP代码也很好)可以显示如何/如何回答“If-None-Match:*”。
答案 0 :(得分:40)
答案是:这取决于。
假设我们已收到
If-None-Match: *
If-Modified-Since: <yesterday date>
页面已经改变今天。
首先,我们看看*
告诉我们:“如果资源在那里则返回304并且满足条件(2)”。很好,资源存在,但条件(2)规定:“只返回304,如果日期晚于当前”。因此不符合此条件,页面将完全传递。
如果我们没有收到If-Modified-Since
,那么回复就是304。
如果资源在请求时不存在,我们已经返回了相应的代码(好像没有If-None-Match
)。
我希望它有所帮助;)
答案 1 :(得分:11)
...如果给出“*”并且该资源存在任何当前实体,则服务器不得执行所请求的方法,除非需要这样做,因为资源的修改日期与If-中提供的日期不匹配请求中的Modified-Since标头字段。
RFC接着说,服务器不应该执行请求,而是应该使用304(未修改)来响应GET和HEAD请求,并且对于所有其他请求类型,它们应该以412(前提条件失败)响应。但这只是在服务器实际拥有所请求资源的某个版本的情况下。如果你没有任何实体,那么应该处理请求(可能是404,因为你没有任何东西)。
要处理请求,首先要弄清楚如果标头不存在,服务器会做什么。如果该请求的结果不为2xx或304,则正常提供请求。但是,如果请求的结果为2xx或304,则处理If-None-Modified案例。当它是星星时,则立即返回304(除非被If-Modified-Since打败)。如果它是一个或多个实体标签,则检查这些标签中的任何一个是否与您计划作为响应的事物的标签匹配。如果有任何匹配,则返回304;如果没有匹配,那就像平时一样服务。
后来在RFC中,还有更多:
“If-None-Match:*”的含义是,如果由原始服务器(或通过缓存,可能使用Vary机制,请参见14.44部分)选择的表示,则不得执行该方法)存在,并且如果表示不存在,应该执行。此功能旨在用于防止PUT操作之间的比赛。
也就是说,明星允许客户说“如果此文件的任何版本已经存在,请不要将此文件丢弃。”