为啥 304 状态码算作“重定向”?

Posted

技术标签:

【中文标题】为啥 304 状态码算作“重定向”?【英文标题】:Why does the 304 status code count as a "redirect?"为什么 304 状态码算作“重定向”? 【发布时间】:2014-07-02 01:26:28 【问题描述】:

我目前正在尝试了解 304/未修改究竟如何符合 3xx 范围类的 HTTP 状态代码。 RFC 1945, sec. 9.3 和 RFC 2616, sec. 10.3 都读取:

此类状态码表明用户代理需要采取进一步的行动来满足请求。

虽然“从客户端的本地缓存加载”显然是“进一步的操作”,但我很难理解这是 HTTP 意义上的重定向。我是不是按字面意思看这个?

【问题讨论】:

【参考方案1】:

我想这是因为服务器正在“重定向”客户端以从其本地缓存加载请求的资源,而不是从服务器下载它。如果客户端没有本地缓存​​副本,那么它首先不应该发送条件请求。

【讨论】:

【参考方案2】:

见http://greenbytes.de/tech/webdav/draft-ietf-httpbis-p2-semantics-26.html#rfc.section.6.4.p.2:

有几种类型的重定向:

    指示资源可能在不同 URI 上可用的重定向,由 Location 字段提供,如状态代码 301(永久移动)、302(找到)和 307(临时重定向)。

    提供匹配资源选择的重定向,每个资源都能够代表原始请求目标,如 300(多项选择)状态代码。

    重定向到由 Location 字段标识的不同资源,该资源可以表示对请求的间接响应,如 303(参见其他)状态代码。

    重定向到以前缓存的结果,如 304(未修改)状态码。

【讨论】:

感谢您的链接。有趣的是,304 列在一个完全不同的部分中。所以语义真的是“重定向到本地缓存的副本?”否则我真的不知道为什么“未修改”不能是 2xx 类代码,例如 201/Created(也可以重定向)或 204/No content。毕竟请求已经成功了。 是的,“If-Modified-Since”标头明确告诉服务器“我知道这个资源存在,并且我知道如何表示它,自从我上次知道它以来它是否被修改过?” - 服务器将回复“304 Not modified”或更合适的代码,例如“200 Ok”(内容的新版本)或“404 Not found”,或任何其他合适的代码。

以上是关于为啥 304 状态码算作“重定向”?的主要内容,如果未能解决你的问题,请参考以下文章

http相应状态码,重定向和转发区别,文件下载流对应格式

http状态码status

http状态码

Java实战之04JavaWeb-02Request和Response

常见http状态码

简谈http状态码