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

Ale*_*exV 46 http http-1.1 http-headers

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

如果 - 无匹配:*

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

编辑:很高兴有一些伪代码(PHP代码也很好)将显示如何/如何回答"If-None-Match:*".

St.*_*and 40

答案是:这取决于.

假设我们收到了

If-None-Match: *
If-Modified-Since: <yesterday date>
Run Code Online (Sandbox Code Playgroud)

该页面今天已被更改.

首先,我们看看*它告诉我们:"如果资源在那里则返回304并且满足条件(2)".很好,资源存在,但条件(2)规定:"只返回304,如果日期晚于当前".因此不符合此条件,页面将完全传递.

如果我们没有收到If-Modified-Since,那么回复将是304.

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

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

我希望它有所帮助;)

  • 要么这样,要么根本没有“If-Modified-Since”。所以有两种方法。 (2认同)
  • 我相信这个答案是不准确的。`If​​-None-Match` 和 `If-Modified-Since` 请求头是互斥的,假设 ETag 在表示变化时发生变化,那么在同一个请求中指定这两个头是没有意义的(因为 `Last-Modified`与“ETag”关联的日期永远不会改变)。存在一个例外,即指定两者确实有意义:当“If-None-Match”和“If-Modified-Since”同时存在时,则忽略“If-Modified-Since”,除非服务器不支持“如果不匹配”。 (2认同)

Rob*_*edy 11

引用RFC 2616(HTTP 1.1):

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

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

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

后来在RFC中,还有更多:

"If-None-Match:*"的含义是,如果由原始服务器(或通过缓存,可能使用Vary机制,参见第14.44节)选择的表示存在,则不得执行该方法,并且应该执行如果表示不存在.此功能旨在用于防止PUT操作之间的比赛.

也就是说,明星允许客户说"如果此文件的任何版本已经存在,请不要输入此文件".

  • 这用普通英语意味着什么?如果*提供*我只是正常服务页面(没有304)?即使提供了If-Modified-Since ...... (4认同)