【问题标题】:What does the HTTP header If-None-Match: * mean?HTTP 标头 If-None-Match: * 是什么意思?
【发布时间】:2010-01-21 18:35:56
【问题描述】:

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

如果没有匹配:*

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

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

【问题讨论】:

    标签: http http-headers http-1.1


    【解决方案1】:

    答案是:视情况而定。

    假设我们收到了

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

    页面已更改今天

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

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

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

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

    希望对你有帮助;)

    【讨论】:

    • 所以当您在 If-None-Match 中有 * 时,发出 304 的唯一方法是在设置并匹配 If-Modified-Since 时?
    • 要么这样,要么根本没有If-Modified-Since。所以有两种方法。
    • 我相信这个答案是不准确的。 If-None-MatchIf-Modified-Since 请求标头是互斥的,假设 ETags 在表示更改时更改,那么在同一个请求中指定两者是没有意义的(因为与 ETag 关联的 Last-Modified 日期永远不会改变)。一个例外情况是同时指定两者都有意义:当If-None-MatchIf-Modified-Since 都存在时,If-Modified-Since 将被忽略,除非服务器不支持If-None-Match
    【解决方案2】:

    引用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 操作之间的竞争。

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-27
    • 2016-06-07
    • 1970-01-01
    • 2012-12-03
    • 2018-06-24
    • 2014-10-08
    • 2012-11-27
    • 2021-07-05
    相关资源
    最近更新 更多