为啥 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 状态码算作“重定向”?的主要内容,如果未能解决你的问题,请参考以下文章