在 Service Worker / fetch() 中识别 HTTP 304

2023-11-27

我构建了一个服务工作人员,它始终使用缓存中的数据进行响应,然后在后台向服务器发送请求。如果服务器响应HTTP 304 - not modified一切都很好,如果服务器响应HTTP 200,这意味着数据已更改,新文件已放入缓存中,同时通知用户并要求刷新页面。

我用not-modified-since / last-modified标头以确保客户端获得最新版本。当请求通过发送时fetch()请求在到达网络的途中传递 HTTP 缓存 - 响应到达客户端时也会传递 HTTP 缓存。问题是当响应的状态为304- 未修改 HTTP 缓存使用缓存版本响应服务工作线程并将状态替换为200(正如在获取规范 - HTTP 网络或缓存获取)。在 Service Worker 中,无法查明是否200响应最初由服务器发送(用户需要更新)或者由缓存发送并且服务器最初响应304(最新版本已加载)。

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

我认为最好的解决方案是设置自定义 HTTP 标头,例如x-was-modified当服务器响应时200。这个自定义标头可以在 Service Worker 中访问,并可用于查明资源是否已更新 - 即使 HTTP 缓存替换了304状态与200.

  • 这是合法的解决方案/解决方法吗?有没有建议的方法来解决这个问题?
  • 在实现 Service Worker 缓存时,我是否应该依赖用于处理 HTTP 缓存的 HTTP 标头?或者我应该使用自定义x-if-modified-since / x-last-modifiedheaders 并使用 indexedDB 将信息存储在客户端并将其附加到每个请求中?
  • 为什么fetch()甚至更换304代码与200缓存中是否有最新版本?

您不能依靠状态代码(304 与 200)来确定某些内容是否已更改。如果代码的其他部分请求相同的资源,从而更新浏览器的缓存怎么办?

相反,只需比较响应Last-Modified您发送的内容的标题If-Modified-Since,或者您上次看到的任何内容Last-Modified。如果值不匹配,则说明某些内容发生了变化。

为了获得更高的精度(如果数据可以在 1 秒内更改多次),请考虑使用ETag代替Last-Modified.

为什么fetch()甚至更换304代码与200缓存中是否有最新版本?

因为通常人们只是想获得新鲜的内容,无论它来自哪里。 304 响应仅对那些实现自己的 HTTP 缓存的人感兴趣。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Service Worker / fetch() 中识别 HTTP 304 的相关文章

  • 通过 http 的私有 git 存储库

    你能推荐任何简单的解决方案来设置可通过http s cleutus建议的 访问的git存储库吗 我有自己的 http 服务器 我想用它来托管一些小型私人项目 在家里我可以通过 ssh 连接 但在工作中防火墙阻止我这样做 有没有免费的方法来设
  • Angular4如何使用flatMap链接forkJoin

    我所处的情况是 我需要进行 5 个可以并行执行的 http 调用 在这五个调用之后需要执行另一个 http 调用 我在前 5 个中使用了 forkJoin 但我不知道如何链接 flatMap 或其他函数 forkJoin firstObse
  • 你可以推荐什么 JavaScript 缓存 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个好的javascript内存缓存库来缓存客户端计算结果 我的要求 适用于 Internet Explorer FireFox
  • Angular JS 在调用新的 $http 之前取消 $http 调用

    在 Angular JS 1 1 5 中 您可以取消之前启动的 http 调用 这两个link1 https stackoverflow com questions 16962232 in angularjs how to stop ong
  • 咖啡因与番石榴缓存

    根据这些微观基准 https github com ben manes caffeine wiki Benchmarks事实证明Caffeine https static javadoc io com github ben manes ca
  • Chrome 在传输一定量的数据后挂起 - 等待可用的套接字

    我有一个浏览器游戏 最近我开始向游戏添加音频 Chrome 无法加载整个页面并卡在 91 requests 8 1 MB transferred 并且不再加载任何内容 它甚至破坏了所有其他选项卡中的网站 说Waiting for avail
  • 外部依赖错误的 HTTP 状态代码

    当服务器与外部 API 通信出现问题时 返回的正确 HTTP 状态代码是什么 假设客户端向我的服务器 A 发送有效请求 然后 A 查询服务器 B 的 API 以便执行某些操作 然而 B 的 API 当前抛出 500 错误或因某种原因无法访问
  • 由于浏览器设置的标头,Safari 拒绝重定向的 CORS 请求

    Summary Safari 拒绝一些涉及重定向的 CORS 请求 声称某些标头是不允许的 但该标头从来不是由脚本请求的 而是由浏览器添加的 所以我认为这应该不重要 Safari 的行为是一个错误吗 规格有问题吗 或者 事情变成这样是有原因
  • 以 RESTful 方式增加资源计数器:PUT 与 POST

    我有一个带有计数器的资源 为了举例 我们将该资源称为profile 计数器是数量views对于该配置文件 Per the 休息维基 http rest blueoxen net cgi bin wiki pl HttpMethods PUT
  • 多个客户端如何同时连接到服务器上的一个端口(例如 80)? [复制]

    这个问题在这里已经有答案了 我了解端口工作原理的基础知识 但是 我不明白的是多个客户端如何同时连接到端口 80 我知道每个客户端都有一个唯一的 对于他们的机器 端口 服务器是否从可用端口回复客户端 并简单地声明回复来自 80 这是如何运作的
  • 在不是结构方法的函数上实现缓存的惯用方法是什么?

    我有一个像这样的昂贵的功能 pub fn get expensive value n u64 u64 let ret 0 for 0 n expensive stuff ret 并且它经常被用相同的参数调用 它是纯粹的 这意味着它将返回相同
  • 收到“路径‘OPTIONS’被禁止”。 ASP.NET网站异常

    我收到错误System Web HttpException Path OPTIONS is forbidden 自从我们将网站转移到新的服务器设置以来 我无法重新创建该错误 但我每天至少会收到几次有关此异常的电子邮件 有什么想法可能导致此问
  • 谁添加“_”单下划线查询参数?

    我有一个在 Apache 上运行的 PHP 服务器 我收到很多类似这样的请求 10 1 1 211 02 Sep 2010 16 14 31 0400 GET request 1283458471913 action get list HT
  • python中的StringIO实际用途是什么?

    StringIO到底是用来做什么的 我一直在互联网上寻找一些例子 然而 几乎所有的例子都非常抽象 他们只是展示 如何 使用它 但它们都没有表明 为什么 和 在什么情况下 应该 将使用它 附注不要与 stackoverflow 上的这个问题混
  • GET 和 POST 方法有什么区别? [复制]

    这个问题在这里已经有答案了 可能的重复 什么时候用POST 什么时候用GET https stackoverflow com questions 46585 when do you use post and when do you use
  • 如何清除浏览器的缓存?

    当我在 Facebook 上玩应用程序且游戏未加载时 会出现提示 要求清除浏览器缓存 如何清除浏览器的缓存 似乎还没有人提到这一点 所以我想我应该插话一下 当你在 Chrome 中打开页面检查器时 你可以右键单击重新加载页面图标将与菜单一起
  • 是否可以使用 PHP 重定向发送 POST 数据?

    更新 这不是重复的如何使用 PHP 发送 POST 请求 https stackoverflow com questions 5647461 how do i send a post request with php 那里的解决方案对我不起
  • ExoPlayer2 - 如何使 HTTP 301 重定向工作?

    我开始使用 ExoPlayer 来传输一些音频 一切都很顺利 直到我遇到一个带有 301 永久移动 重定向的 URL ExoPlayer2 默认情况下不处理该问题 我已经看过这个线程 https github com google ExoP
  • 动态img(或视频)标签根本不加载资源,HTTP请求处于“待处理”状态

    我尝试使用以下方法在 Web 应用程序上加载资源时遇到一些问题img or videoHTML 标签 我在我的应用程序中使用 Angular 并动态设置src的参数img标签 使用ng src src 指示 没有那么多图像和资源需要加载 在
  • 如何在 Laravel 中使用 PUT http 动词提交表单

    我知道这个问题可能已经提出 但我就是无法让它发挥作用 如果有人可以帮助我 我将非常感激 我安装了 colletive form 但答案也可以是 html 表单标签 现在列出我的表格 我的路线和我的例外情况 Form model array

随机推荐

  • 无法初始化 Spark 上下文

    我正在尝试在 Python 中初始化 Spark Context 变量 from pyspark import SparkContext SparkConf conf SparkConf setAppName test setMaster
  • 无法加载资源:帧加载再次中断

    我有从虚假链接下载图片的代码 我查看了其他评论 网站 但没有任何东西可以帮助我找到解决烦人问题的方法 加载资源失败 帧加载中断 我的 php 标头是在读取 GET 值之后 header Pragma public required head
  • 如何解决 azure keyvault 机密(未经授权)AKV10032:无效的颁发者。 Python 中的错误

    我正在使用azure keyvault 秘密在 Python 3 8 中管理我的资源秘密的包 开发于PyCharm 但是当我运行以下命令时 import os from azure keyvault secrets import Secre
  • 如何在移动设备上进行画布绘图

    我的画布绘图界面在桌面上完美运行 但在 iPhone 上无法运行 当我尝试画画时 它只会在我拇指所在的地方画出一个点 当我拖动拇指时 没有线条 页面继续滚动 Code var clearButton document getElementB
  • 我有这个错误“#1273 - 未知排序规则:'utf8mb4_0900_ai_ci'”

    CREATE TABLE payment methods payment method id tinyint 4 NOT NULL AUTO INCREMENT name varchar 50 NOT NULL PRIMARY KEY pa
  • 在具有 Root 权限的 Android 4.4.2 中启用 KioskMode

    我能够通过终止 KitKat 之前的版本来启用 kiosk 模式com android systemui过程 无论如何 这似乎在 KitKat 版本中不起作用 终止进程后 整个屏幕卡住了 我无法按任何按钮 在检查了 Play 商店中的类似应
  • 第二次单击时从元素中删除活动和焦点

    我正在尝试制作一个带有信息的交互式地图 当您单击一个点时 它会调整大小并显示一些联系人 这是因为该元素获得了 active and focus伪类 有什么方法可以在第二次单击元素时从元素中删除伪类吗 实际上 是否可以在再次单击元素时关闭元素
  • RAISERROR―如何与SqlException区分?

    我有一些 3 4 个存储过程 如果需要的话我可以修改它们 使用RAISERROR通知我的应用程序数据库方面的一些致命错误 其中一些存储过程是从 C 端执行的ExecuteNonQuery 而其他则执行ExecuteReader 目前 我将这
  • 将所有包含内容放在一个头文件中是个好主意吗?

    对于 C 来说 放入 C 头文件中的内容的最佳实践是什么 将跨多个源文件的程序使用的所有包含内容放在一个头文件中是否有用 几乎每个文件 即 stdio h 中都使用的包含怎么样 不会 它只会增加麻烦和开销 作为维护者 你面临的最大的痛苦之一
  • Maven - 未解决部署在 Artifactory 上的工件的传递依赖关系

    我有两个项目 A 和 B 其中 A 依赖于 B 我将 B 打包为 jar 并将其部署在 maven 服务器 artifactory 上 然后将该 jar 包含在 pom 文件中作为项目 A 的正常依赖项 B 的 jar 文件显示在项目 A
  • 使用 Google Apps 脚本修改绘图

    有没有人找到使用 Google Apps 脚本创建或更改绘图的支持 我已经浏览过谷歌文档 但我没有看到任何绘画课程 我发现了如何构建用户界面元素 但不是图纸 我希望将绘图作为文档或电子表格的一部分 但独立的绘图就足够了 直到今天 还无法执行
  • shell_exec 无需等待输出[重复]

    这个问题在这里已经有答案了 可能的重复 PHP 中的异步 shell 执行 有没有办法使用 shell exec 而不等待命令完成 我想运行一个相当慢 复杂的程序 至少需要 10 分钟才能完成 我想通过 shell exec 或类似的东西来
  • 如何优雅地返回默认初始化的对象?

    我有一个如下所示的课程 class VeryVeryVeryLongTypeName bool is ok VeryVeryVeryLongTypeName is ok false VeryVeryVeryLongTypeName f Ve
  • 如何从 bootRun 传递 JVM 选项

    我正在开发与远程主机通信的简单 Spring Web 应用程序 我想在公司代理后面在本地测试它 我使用 Spring Boot gradle 插件 问题是如何指定 JVM 的代理设置 我尝试了几种方法来做到这一点 gradle Dhttp
  • 使用 Apache Beam 按键处理事件的总排序

    问题背景 我正在尝试从实时流中生成每个键的事件项的总 线性 顺序 其中顺序是事件时间 源自事件有效负载 Approach 我曾尝试使用流式传输来实现此目的 如下所示 1 设置一个非重叠的顺序窗口 例如时长5分钟 2 建立允许的迟到 可以丢弃
  • 自动日期/时间解析器,无需指定格式[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我正在寻找一个java库 它可以将字符串解析为POJO而不指定格式 我研究过POjava 还有其他库可以做类似的事情吗 DateTime dateT
  • 为什么Spark要将Map阶段的输出保存到本地磁盘?

    我试图深入了解 Spark Shuffle 过程 当我开始阅读时 我遇到了以下几点 Spark 完成后将 Map 任务 ShuffleMapTask 输出直接写入磁盘 我想了解以下关于 Hadoop MapReduce 的内容 如果Map
  • 在 Meteor.js 中,如何让两个开发项目使用同一个 Mongo 实例?

    我希望两个单独的应用程序使用相同的 Mongo DB 实例 并且由于我同时开发它们 因此我希望能够共享相同的开发数据库实例 我意识到 Meteor 的每个实例都必须在它自己的端口上运行 有没有办法像系统版本的MongoDB一样强制meteo
  • 当每个请求的应用程序 ID 和应用程序密钥都不同时,使用omniauth-facebook 吗?

    The omn iauth facebook自述文件提到了如何在初始化程序中设置它以及如何设置选项 例如scope仅根据请求 我想知道是否也可以为每个请求设置应用程序 ID 和应用程序密钥 你可以这样做 在您的omniauth rb 上 执
  • 在 Service Worker / fetch() 中识别 HTTP 304

    我构建了一个服务工作人员 它始终使用缓存中的数据进行响应 然后在后台向服务器发送请求 如果服务器响应HTTP 304 not modified一切都很好 如果服务器响应HTTP 200 这意味着数据已更改 新文件已放入缓存中 同时通知用户并