小编Sve*_*ath的帖子

在 service worker / fetch() 中识别 HTTP 304

我构建了一个服务工作者,它总是用来自缓存的数据进行响应,然后在后台向服务器发送请求。如果服务器响应HTTP 304 - not modified一切正常,如果服务器响应HTTP 200,则意味着数据已更改并将新文件放入缓存中,同时通知用户并要求刷新页面。

我使用not-modified-since/last-modified标头来确保客户端获得最新版本。当通过请求发送fetch()请求时,它会在其通往网络的路上传递 HTTP 缓存 - 响应到达客户端时也会传递 HTTP 缓存。问题是当响应具有状态时304- 未修改 HTTP 缓存使用缓存版本响应服务工作者并将状态替换为200(如获取规范中所述 - HTTP-network-or-cache-fetch)。在 Service Worker 中,无法确定200响应最初是由服务器发送的(用户需要更新)还是由缓存发送并且服务器最初响应为304 (已经加载了最新版本)。

有可以设置为的缓存模式标志no-cache,但是当请求发送到服务器时,这也会绕过 HTTP 缓存,这意味着if-modified-since未设置标头并且服务器没有机会找出哪个版本客户有。此外,此标志目前仅由 Firefox 每晚支持。

我认为最好的解决方案是设置一个自定义的 HTTP 标头,就像x-was-modified服务器以200. 可以在 service worker 中访问此自定义标头,并可用于确定资源是否已更新 - 即使 HTTP 缓存将304状态替换为200.

  • 这是一个合法的解决方案/解决方法吗?是否有任何建议的方法来解决这个问题?
  • 在实现 Service Worker 缓存时,我是否应该依赖处理 HTTP 缓存的 HTTP 标头?或者我应该使用自定义x-if-modified-since …

caching http http-caching http-status-code-304 service-worker

6
推荐指数
1
解决办法
4460
查看次数

没有SPDY的HTTP/2可能吗?

大多数浏览器都支持HTTP/2,一些服务器也支持.

例如,Akamai提供HTTP/2测试页(https://http2.akamai.com/).当我在chrome中访问此页面并转到chrome://net-internals/#spdy该页面时,会列出协议h2-14(HTTP/2草案14).但是,当我打开Akamai的页面上的控制台,然后输入window.chrome.loadTimes()属性wasFetchedViaSpdytrue.为什么是这样?Akamai页面是HTTP/2,而不是SPDY,roght?

我得到的另一件事是本教程(https://www.gatherdigital.co.uk/blog/how-to-setup-http-2-support/527).它说:

"如何设置HTTP/2支持(nginx,apache,plesk)[...]嗯,不是HTTP/2,它仍然是mod_spdy."

什么是这个HTTP/2"over"SPDY的东西?我的问题的原因是我想对哪些页面使用哪种协议进行一些测量.

spdy http2 mod-spdy

4
推荐指数
1
解决办法
687
查看次数

cURL 不适用于 nghttp2

我想将 http/2 与 cURL 一起使用。首先,当我尝试此操作时出现错误curl --http2 https://http2.akamai.com/- “协议不支持”我安装了 nghttp2 并重新安装了 cURL,就像这里描述的那样。错误消失了,我现在可以获取数据了curl --http2。但是页面https://http2.akamai.com/告诉我“此浏览器未启用 HTTP/2”,而在 chrome 中或直接通过 nghttp2 则显示“您现在正在使用 HTTP/2!”

我使用的是 mac os x 并通过 homebrew 安装了最新版本中的所有依赖项。我在这里下载了curl源代码(7.41)。

curl http2 nghttp2

2
推荐指数
1
解决办法
7542
查看次数