对 CORS 请求的 304 Not Modified 响应是不是应该包含 CORS 标头?

Posted

技术标签:

【中文标题】对 CORS 请求的 304 Not Modified 响应是不是应该包含 CORS 标头?【英文标题】:Should a 304 Not Modified response to a CORS request contain CORS headers?对 CORS 请求的 304 Not Modified 响应是否应该包含 CORS 标头? 【发布时间】:2021-08-16 05:08:08 【问题描述】:

说一个客户端做了一个跨域请求读取一个对象,通过了,客户端缓存了结果。现在,客户端发出一个新的读取对象的请求,而之前的结果仍然缓存在浏览器中。

客户端发出此请求:

GET /pony.png HTTP/1.1

Host: server.com
Origin: field.com
If-None-Match: "etag-abcd"

现在,假设“etag-abcd”对该对象有效。服务器回复

HTTP/1.1 304 Not Modified

Etag: "etag-abcd"
Date: Tue, ...
Expires: Wed, ...

如果这是一个有效的跨域请求,服务器是否有义务提供适当的Access-Control-Allow-Origin 和其他标头?或者,客户端是否有义务尊重与原始缓存结果一起出现的 CORS 标头?

The Fetch standard 相当复杂,但它包含诸如“由于 CORS 检查不适用于状态为 304 或 407 的响应......”之类的短语,这让我怀疑新的 CORS 标头在304 响应。

另一方面,我阅读 §4.6,步骤 10.4,表明 304 响应中的标头优先,甚至替换原始 GET 响应标头中的任何缓存结果。

【问题讨论】:

【参考方案1】:

是的,HTTP-network-or-cache fetch 确实会处理 304 响应,但它最终会返回更新后的存储响应,然后在 HTTP fetch 中执行 CORS 检查。因此,对于典型的 304,不需要 CORS 标头,因为它们已经存在于存储的响应中。

有一些极端情况:

    即使客户端不执行验证请求,服务器也可能返回 304 响应。在这种情况下,它必须具有 CORS 标头,因为将对 304 响应执行 CORS 检查(而不是使用 304 响应更新的存储响应)。 304 响应可能会更新 CORS 标头。 (我不确定我们是否有足够的测试覆盖率来应对这种情况。)

【讨论】:

我明白了。因此,304 响应中存在的任何标头都将替换先前 GET 响应中的任何标头,因此 304 可以更改 CORS 响应。但是如果 304 省略了标头,那么应该保留原始的 CORS 标头。那么,如果我理解正确,答案是服务器没有义务在 304 响应中包含 CORS 标头,但如果需要,304 将提供更改标头的机会。谢谢! 来晚了,但你理解正确。 谢谢,这很有帮助!

以上是关于对 CORS 请求的 304 Not Modified 响应是不是应该包含 CORS 标头?的主要内容,如果未能解决你的问题,请参考以下文章

防止Tomcat中的304 NOT MODIFIED响应

即使使用 django-cors-headers 也得到 304 响应

nginx 304 not modified 怎样解决

网页打开很慢,加载js和css状态是304 Not Modified,高手们,要怎么解决?

If-None-Match 有效时 304 Not Modified

使用HttpWebRequest时,为什么我在某些链接上出现“(304)Not Modified”错误?