如何让浏览器或 PHP 缓存 fetch() 请求?

2024-06-24

这基本上是相反的fetch(),如何发出非缓存请求? https://stackoverflow.com/questions/29246444/fetch-how-do-you-make-a-non-cached-request.

假设我们有客户端:

<div onclick="fetch('/data.php').then(r => r.text()).then(s => console.log(s));">Click me</div>

PHP 中的服务器端:

<?php echo "hello"; /* in reality, this can be much more data 
                       and/or updated later with other content */ ?>

点击时多次 on Click me,请求通过网络多次完成,请求响应代码为“200”。

Thus, 没有进行缓存通过浏览器/通过 PHP:

如果实际上不需要这些数据,如何防止多次传输?

潜在的解决方案:自/data.php可以在服务器上更新,服务器可以使用日期时间元数据来服务数据请求timestamp,我可以将其存储在客户端 JS 变量中timestamp。然后在进行下一步之前fetch要求/data.php,我可以提出初步要求

fetch('/get_last_modification_date.php').(r => r.json()).then(data => {
    if (data['timestamp'] != timestamp)
        fetch('/data.php')...       // if and only if new data is here
});

因此,我们only do a fetch('/data.php')...如果该数据的时间戳比我们已有的时间戳更新。

这可行,但似乎我们正在手动做一些可以通过浏览器+PHP缓存机制完成的事情。

如何要求 PHP 和浏览器为我们完成所有这些缓存?


fetch()其行为与常规 HTTP 请求相同,因此您只需应用有关缓存的标准 HTTP 规则即可。 例如,您可以使用If-Modified-Since机制,我会解释一下。

当服务器返回资源的以下标头时:

Cache-Control: no-cache
Last-Modified: <date in RFC2616 format>

然后,在后续请求中,浏览器将发送一个If-Modified-Since标头与Last-Modified日期。 如果服务器返回一个304(未修改)状态,则浏览器将使用该资源的缓存版本。

备注:尽管有其名称,no-cache指令并不意味着资源不能被缓存;这只是意味着 浏览器在使用它之前必须与服务器验证它。

为了说明这一点,我假设您想要发送一些内容data.txt file:

<?php
// Get the modification time of the resource
$dataTime = filemtime('data.txt');

if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE']))
{
    $sinceTime = strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']);
    if($sinceTime==$dataTime)
    {
        // The browser already has the latest version of the resource
        header('HTTP/1.1 304 Not Modified');
        exit;
    }
}

// Send the resource
header('Cache-Control: no-cache');
header('Last-Modified: '.gmdate('D, d M Y H:i:s T', $dataTime));
header('Content-Type: text/plain; charset=UTF-8');
readfile('data.txt');
?>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何让浏览器或 PHP 缓存 fetch() 请求? 的相关文章

  • 防止 Node.js 中的 SQL 注入

    是否有可能以与 PHP 具有防范 SQL 注入的预准备语句相同的方式防止 Node js 中的 SQL 注入 最好使用模块 如果是这样 怎么办 如果不 有哪些例子这可能会绕过我提供的代码 见下文 一些背景 我正在制作一个 Web 应用程序
  • 在 PHP 中使用重命名函数时出错

    尽管文件仍然被移动到正确的目录中 但我不断收到此错误 有人知道我为什么会收到此错误吗 Warning rename Images uploaded 1162504 56863010 jpg Images uploaded Portraits
  • 将新数据添加到 d3 Streamgraph 时的转换

    我使用d3绘制了一个与官方示例非常相似的流图http bl ocks org mbostock 4060954 http bl ocks org mbostock 4060954 唯一的区别是我如何用新数据更新它 我不仅想要垂直 y 值 过
  • 通过标记或JS强制下载

    假设我在 CDN 来自 Rackspace 的云文件 上有一个文件 以及一个包含该文件链接的静态 html 页面 有什么方法可以强制下载此文件 以防止它在浏览器中打开 例如 mp3 我们可以让我们的服务器读取该文件并将相应的标头设置为 he
  • html/js 中从右到左和/或从上到下的文本?

    如何在浏览器中为用户输入创建从右到左和从上到下的文本字段 有没有本地方法可以做到这一点 或者也许有解决方法 从上到下可能像日语或象形文字 对于 RTL 文本字段 您可以使用 HTMLdir属性 如 ime Vidas 已经提到的 或 wit
  • 如何在 Chrome 中将 Set 转换为数组?

    如何将集合转换为数组 https stackoverflow com questions 20069828 how to convert set to array给出了将 Set 转换为 Array 的三个答案 目前在 Chrome 浏览器
  • 将查询错误转变为 MySQLi 中的异常[重复]

    这个问题在这里已经有答案了 我试图将 MySQLi 查询错误转为异常 但无法 mysqli sql 异常 http php net manual en class mysqli sql exception php仅当连接数据库失败时才会抛出
  • `forEach` 函数中的 `return` 关键字是什么意思? [复制]

    这个问题在这里已经有答案了 button click function 1 2 3 4 5 forEach function n if n 3 it should break out here and doesn t alert anyth
  • 同心放射圆 d3

    我有一个等距值的数组 我用它来绘制同心圆 我想使用一种散发效果 本质上是 一旦最外面的圆的值超过最大值 就将其删除 并在中心添加一个新的圆来补偿 我不确定如何操作数据集来删除和添加新圆圈
  • PHP、MySQL 验证故障且搜索不起作用?

    我创建了一个小的注册粘性表格 一切工作正常 但如果我输入任何错误的值 例如姓名中的数字 年龄中的字母甚至错误的电子邮件格式 那么数据仍然保存在数据库中 我无法找出验证问题 另外一个是搜索选项 每当我在搜索框中输入任何名字或姓氏时 它都应该显
  • 如何在 Google 地图上旋转叠加图像?

    我正在尝试将一系列叠加层放置到 Google 地图上 我正在跟随地面覆盖层的示例代码 https developers google com maps documentation javascript examples groundover
  • 重复 Pinterest Facebook 邀请功能

    I m trying to duplicate Pinterest s Invite Friends functionality In case you haven t seen what it looks like it looks li
  • 从组件刷新/重新加载 ember 路由

    我有一个组件 它实际上是一个模式对话框 当我完成该对话框并按 确定 按钮时 我想留在打开该对话框的停留页面上 这并不难 但问题是该对话框更改了数据 我通过 REST 调用获取数据 因此我需要刷新已经所在的路线以反映数据更改 因为我是从组件中
  • 为什么我的数据没有存储到我的 Firebase 实时数据库中?

    我正在尝试为网络应用程序制作一个注册页面 这会将数据发送到 firebase 数据库 我已阅读官方 firebase 文档并按照说明写入数据 但什么也不会写 在我的数据库控制台中 它显示的所有内容都是空 而不是我的数据 我没有收到控制台错误
  • HTML 画布从 getImageData 返回“偏离一些”字节

    我找到getImageDataHTML 画布似乎返回不正确的字节值 我使用以下 Python 代码生成了 1x1 px 图像 from PIL import Image import numpy as np a np array 12 18
  • JavaScript 模板文字稍后替换变量(在知道值之前)

    是否可以在已知值之前以某种方式使用模板文字 JS 模板文字的每个演示都如下所示 var name John var s Hello name 但在现实世界中 模板是在我们知道变量值之前定义的 某处定义了模板 在页面加载时 var s Hel
  • 是否可以倒回 PDO 结果?

    我正在尝试为 PDO 语句的结果编写一个迭代器 但找不到任何回退到第一行的方法 我想避免调用 fetchAll 和存储所有结果数据的开销 first loop works fine foreach statement as result d
  • 将json数据从servlet传递到jsp到js文件

    我得到了这个创建 JSON 数据的 servlet 我想将此数据传递到一个 jsp 页面 该页面应该通过 InfoVis 工具包显示数据 servlet java JSONObject json new JSONObject JSONArr
  • 在用户单击之前图像不会绘制在画布上?

    我使用执行类似以下操作的函数绘制几张图像 context drawImage img width 2 1 height 2 1 width height 我读过 我需要等待图像加载后才能绘制它 如下所示 img onload functio
  • ASP.NET MVC3 Ajax.ActionLink - 条件确认对话框

    我有一个 Ajax ActionLink 仅当满足某些条件 用户有未保存的更改 时 我才希望显示一个确认对话框 我创建了一个 JavaScript 函数 它根据需要显示确认对话框 并根据响应返回 true 或 false 我将其绑定到 Ac

随机推荐

  • CDI:从一个注入点通过限定符到另一个注入点

    我想使用 CDI 传递限定符注释 我的意思是 我想向注入点添加一个限定符 该限定符不直接应用于 第一级 注入目标 因为只有一个实现 但 2nd level 注入的 EJB CDI 可以做到这一点吗 它可能已经可以开箱即用了吗 它应该类似于
  • Yii2 gii crud 错误 找不到类 'app\models\Yii'

    我刚刚安装了 yii2 高级模板 创建了一个新闻模型 现在我想创建 Crud 使用 gii 但是当我单击 预览 时 出现此错误 我没有更改高级模板中的任何其他内容 我用的是wamp PHP Fatal Error yii base Erro
  • 在虾中使用列表

    我使用 prawn 创建 pdf 文件 其中包含大量表格格式的数据和一些列表 列表的问题在于 我只是使用文本作为列表 因为没有与 ul gt li 列表等效的语义 就像我在 webfrointend 中使用它们一样 所以这些清单是不合理的
  • 多个 dex 文件定义 landroid/support/annotation/AnimRes

    当我将 android 支持注释添加到我的依赖项时 compile com android support support annotations 20 0 0 我收到这个错误 错误代码 2 输出 意外的顶级异常 com android d
  • Jenkins - 设置向导空白?

    我尝试设置一个安装了 Jenkins 的 docker 映像 我使用了向导 输入了初始密码 并安装了推荐的插件 之后 当我连接到 localhost 8080 页面时 我只得到一个空白页面詹金斯初始页面 https i stack imgu
  • 在 URL 中嵌入 ETag

    有关 Play 中资产指纹识别的问题 如何要求 Play 在 URL 中嵌入 ETag 而不使用第三方插件 例如 如果 css resource cssETag 为1234 那么它就会变成 css responsive 1234 css 相
  • 使用ngx-print打印图像的问题

    图像未使用 ngx print 打印 我不确定我在这里做错了什么 HTML
  • 检查 pyspark df 列的值是否存在于其他 pyspark df 列中

    我有 2 个 pyspark 数据帧 我想检查一列的值是否存在于另一个数据帧的列中 我只看到了如何过滤存在的值的解决方案 像这样 https stackoverflow com questions 41775281 filtering a
  • 打印泰语

    我有一个使用 ESC POS 将收据打印到收据打印机的应用程序 它需要支持泰语 当我尝试打印泰语时 一些字符被分开 如下图所示 这是我的代码 printMSG Command ESC t Command DecimalToCharStrin
  • 哈希函数何时彼此正交?

    哈希函数何时彼此正交 您能提供一个 Java 中两个彼此正交的哈希函数的示例吗 From 正交哈希函数 两个哈希函数h1和h2是正交的 如果对于所有状态 s s S 且 h1 s h1 s 且 h2 s h2 s 我们有 s s S Ede
  • Doctrine2 命名查询

    我在 Doctrine2 中找不到任何有关命名查询的文档 请帮忙 Doctrine2 有命名查询功能吗 您可以使用 命名查询 DQL 例子 use Doctrine ORM Mapping NamedQuery use Doctrine O
  • 使用 AVAssetWriter 录制视频时获取视频的持续时间

    我有一堂课将视频和音频录制到 mp4 文件中 我用AVAssetWriter AVAssetWriterInput做这样的任务 使用这种方法录制视频时如何获取视频的持续时间 AVAssetWriter 开始startSession时可以节省
  • 如果等于特定值则替换列

    我希望替换 CSV 中的第四列 如果它等于 N A 我正在尝试将其更改为 1 我似乎无法让它发挥作用 awk F if 4 N A 4 1 test csv 您可以使用以下内容awk awk F 4 4 N A 1 4 1 OFS test
  • 在 Laravel 4 路由中接受编码的 URL

    我正在 Laravel 4 Beta 5 中开发一个网站 我试图将编码的 URL 传递到路由器 问题是 编码的 URL 中包含百分比等 因此它被 Laravel 阻止 URL 使用 Javascript 函数进行编码encodeURICom
  • 在 Android 模拟器中访问 google api 时出现运行时错误

    我正在尝试访问 googleFit API 看起来很简单 获取谷歌登录权限和所需的授权 然后查询步数 我的代码似乎不起作用 当我调试它时 fitnessOption声明部分抛出 源代码与字节码不匹配 错误 我清理了我的项目 重建它但不起作用
  • 如何在使用 Android Paging 3 库时显示空视图

    我正在使用 Paging 3 库 我可以检查刷新状态是否为 正在加载 或 错误 但我不确定如何检查 空 状态 我可以添加以下条件 但我不确定其条件是否正确 adapter loadStateFlow collectLatest loadSt
  • ExcelDna F# 和可选参数

    对于标量 即非类似数组 可选参数 我将使用以下模式
  • 如果我在计算强连通分量时不使用 G 转置会怎样?

    我正在阅读算法导论 在 22 5 强连通分量中 算法 STRONGLY CONNECTED COMPONENT G 定义为 调用 DFS G 计算每个顶点 u 的完成时间 u f 计算 G 转置 调用 DFS G transpose 但在
  • 如何给 Git 控制台着色?

    我最近看到gitWindows 中的控制台是彩色的 例如绿色表示添加 红色表示删除等 我如何为我的颜色上色git这样的控制台 为了安装它 我使用了以下命令 sudo apt get install git core As noted htt
  • 如何让浏览器或 PHP 缓存 fetch() 请求?

    这基本上是相反的fetch 如何发出非缓存请求 https stackoverflow com questions 29246444 fetch how do you make a non cached request 假设我们有客户端 d