微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Safari 在收到 304 响应时无法加载缓存资源

如何解决Safari 在收到 304 响应时无法加载缓存资源

我最初在 GitHub 上的 Actix discussion boards 上发布了这个问题,但我认为它可能会在 SO 中得到更多曝光,所以就这样吧。

所以,我有这样的设置:

// --snip--
.wrap(DefaultHeaders::new().header("cache-control","public,max-age=5,must-revalidate"))
.service(
    actix_files::Files::new("/",&settings.server.public_dir)
        .index_file(&settings.server.index_file)
)
// --snip--

如果我在没有 SSL 的情况下运行我的服务器,它认为 HTTP/1.1,因此当我向静态文件(例如 app.js)发出请求(任何浏览器)时,一切都如我所愿。服务器返回 200 状态,其中包含正确的文件和正确的缓存标头以及 ETagLast-Modified 标头。认情况下启用 Etags 和上次修改

如果我在不到 5 秒的时间内发出后续请求,也不奇怪 - 浏览器不会尝试新的请求,因为它们已将文件缓存了 5 秒。

当我在 5 秒内发出另一个请求时,浏览器会正确地向服务器发送条件请求,包括带有 if-none-match 预期 etag 值的 app.js 标头,并且服务器会正​​确返回一个304 Not Modified 响应而不实际在响应正文中发送文件

RESPONSE: Ok(
ServiceResponse HTTP/1.1 304 Not Modified
  headers:
    "last-modified": "Mon,08 Feb 2021 14:56:48 GMT"
    "accept-ranges": "bytes"
    "cache-control": "public,must-revalidate"
    "content-encoding": "gzip"
    "content-type": "image/jpeg"
    "etag": "\"c55582f:11923:60215130:4678e1d\""
    "content-disposition": "inline; filename=\"test.jpeg\""
  body: Stream
)

这里也没有意外,因为这种行为正是我期望发生的。问题是当我启用 SSL 并且我的服务器开始通过 HTTP/2 返回流正文时。

Chrome 和 Firefox 浏览器的行为方式与以前完全相同,如果在 5 秒后发出后续请求,并且收到 304 响应时,它们会再次请求资源,它们只需从其缓存中加载我的 app.js

Safari(Macos 和 iOS),另一方面,完全不知道如何处理 304 响应。它确实正确发送了 if-none-match 和 since-last-modified 标头,但是当 actix 回复 304 时,它无法加载我的静态文件

“网络”选项卡也无济于事:

safari network tab is useless

它说“没有响应标头”显然是废话,因为我可以在 Actix 中调试标头并查看它们实际上是正确的:

RESPONSE: Ok(
ServiceResponse HTTP/1.1 304 Not Modified
  headers:
    "last-modified": "Sun,14 Feb 2021 10:54:28 GMT"
    "accept-ranges": "bytes"
    "content-encoding": "br"
    "content-type": "application/javascript"
    "etag": "\"a352043:2db3:60290164:2f00192\""
    "content-disposition": "attachment; filename=\"VideoPlayer.js\""
  body: Stream
)

我注意到在浏览器未缓存文件时对文件的第一个请求,响应是 HTTP/2,但对条件请求的响应是 HTTP/1.1,如您在以上摘录。

在这个问题上停留了一段时间,所以非常感谢任何帮助或指导。

谢谢!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。