怎么防止HTML缓存机制误伤关键接口

风伟吖_4986

风伟吖_4986

2026-10-23

472人浏览

原创

html缓存头不可污染api接口,必须按路径精确分离策略:html设no-cache,must-revalidate,api设no-store,并禁用cdn/代理对/api/的缓存。

怎么防止html缓存机制误伤关键接口

HTML缓存头别污染接口响应

HTML 文件的缓存策略(比如 Cache-Control: no-cache)只该作用于 HTML 本身,绝不能“顺手”让所有响应都带上同样头——尤其不能波及 API 接口。否则,fetch("/api/user") 可能被浏览器或中间代理缓存,导致用户看到过期数据,且刷新也无效。

  • 常见错误:在 Nginx 的 server 块顶层加 add_header Cache-Control "no-cache",结果所有路径(包括 /api/)都被强制校验,违背 REST 接口幂等性设计初衷
  • 正确做法是按路径精确控制:对 HTML 路径(如 /index.html、/*.html)设 no-cache, must-revalidate;对 API 路径(如 /api/、/graphql)单独设 no-store
  • Express 中不要用 app.use((req, res, next) => { res.set("Cache-Control", "...") }) 全局拦截,而应在具体路由里写:app.get("/api/*", (req, res) => { res.set("Cache-Control", "no-store"); next(); })
  • CDN(如 Cloudflare)默认可能对所有 GET 请求启用缓存,必须进控制台关闭 /api/* 路径的缓存开关,或配置「Cache Level: Bypass」

fetch 默认会缓存 GET,但你没意识到

Vue/React 项目里调 fetch("/api/data") 拿列表,第二次进页面却显示旧数据?不是后端没更新,是浏览器把这次请求当静态资源缓存了——即使响应头写了 no-cache,Safari 和部分 Chromium 版本仍可能磁盘缓存 GET 响应。

Html2md
Html2md

使用 Readability + Turndown 将 HTML 页面转换为干净的、Agent 友好的 Markdown。去除导航栏、广告、页脚、Cookie 横幅、社交按钮等干扰元素。支持 URL...

下载
  • fetch 默认行为是遵循 HTTP 缓存规则,不加 cache 选项就等于 cache: "default",它真会复用缓存
  • 显式禁用:用 fetch(url, { cache: "no-store" }) 或 { cache: "reload" }(后者强制跳过缓存并重发请求)
  • axios 用户注意:cache: false 在 v1.7+ 才原生支持;老版本更稳妥的是加时间戳参数:params: { t: Date.now() },或手动设头:headers: { "Cache-Control": "no-store" }
  • 别依赖 no-cache 让浏览器“每次验证”,因为协商缓存(ETag / Last-Modified)仍可能返回 304 并复用旧响应体——对 API 来说,这和缓存没区别

HTML 和 API 缓存策略必须分离部署

同一域名下,HTML 和接口共用一个服务端配置时,最容易出问题。比如 Vercel 上只配了一条 _headers 规则匹配 /**/*.html,但忘了 /api/ 路由实际走的是 Serverless Function,它的响应头由函数内部控制,不会继承静态规则。

  • Nginx 示例:为 HTML 单独写 location,避免和 proxy_pass 冲突
    location = /index.html {
      add_header Cache-Control "no-cache, must-revalidate";
    }
    location /api/ {
      proxy_pass http://backend;
      # 这里必须显式清除或覆盖上游带的缓存头
      proxy_hide_header Cache-Control;
      add_header Cache-Control "no-store";
    }
  • Netlify 用户:在 netlify.toml 中,[[headers]] 规则按 path 匹配,务必分开写两段:for = "/index.html" 和 for = "/api/*",不要合并成通配
  • 本地开发用 file:// 协议时,HTTP 头根本不存在,所有缓存测试都无效——必须走 localhost 启服务验证

最常被忽略的一点:HTML 页面里内嵌的 script 或 link 标签加载的 JS/CSS,其缓存行为完全独立于 HTML,但它们的版本若和 HTML 不同步(比如 HTML 缓存了 1 小时,JS 却已更新),就会出现白屏或报错。所以 index.html 必须短缓存(max-age=0 或 no-cache),而 JS/CSS 要靠文件哈希命名+长期强缓存来解耦。

前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!

相关文章

HTML速学教程(入门课程)
HTML速学教程(入门课程)

HTML怎么学习?HTML怎么入门?HTML在哪学?HTML怎么学才快?不用担心,这里为大家提供了HTML速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

html缓存机制 html

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
html版权符号
html版权符号

html版权符号是“©”,可以在html源文件中直接输入或者从word中复制粘贴过来,php中文网还为大家带来html的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.14

6555

7

html在线编辑器
html在线编辑器

html在线编辑器是用于在线编辑的工具,编辑的内容是基于HTML的文档。它经常被应用于留言板留言、论坛发贴、Blog编写日志或等需要用户输入普通HTML的地方,是Web应用的常用模块之一。php中文网为大家带来了html在线编辑器的相关教程、以及相关文章等内容,供大家免费下载使用。

2023.06.21

3652

4

html网页制作
html网页制作

html网页制作是指使用超文本标记语言来设计和创建网页的过程,html是一种标记语言,它使用标记来描述文档结构和语义,并定义了网页中的各种元素和内容的呈现方式。本专题为大家提供html网页制作的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.31

3330

5

html空格
html空格

html空格是一种用于在网页中添加间隔和对齐文本的特殊字符,被用于在网页中插入额外的空间,以改变元素之间的排列和对齐方式。本专题为大家提供html空格的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.01

3339

5

html是什么
html是什么

HTML是一种标准标记语言,用于创建和呈现网页的结构和内容,是互联网发展的基石,为网页开发提供了丰富的功能和灵活性。本专题为大家提供html相关的各种文章、以及下载和课程。

2023.08.11

4999

6

html字体大小怎么设置
html字体大小怎么设置

在网页设计中,字体大小的选择是至关重要的。合理的字体大小不仅可以提升网页的可读性,还能够影响用户对网页整体布局的感知。php中文网将介绍一些常用的方法和技巧,帮助您在HTML中设置合适的字体大小。

2023.08.11

3281

3

html转txt
html转txt

html转txt的方法有使用文本编辑器、使用在线转换工具和使用Python编程。本专题为大家提供html转txt相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.31

3089

3

html文本框代码怎么写
html文本框代码怎么写

html文本框代码:1、单行文本框【<input type="text" style="height:..;width:..;" />】;2、多行文本框【textarea style=";height:;"></textare】。

2023.09.01

2708

6

HTML嵌入CSS样式的方法
HTML嵌入CSS样式的方法

HTML嵌入CSS样式的方法有内联样式、内部样式表和外部样式表。本专题为大家提供CSS样式相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.20

2808

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
GDB 17.2 官方文档集合
GDB 17.2 官方文档集合

共0课时 | 0人学习

Bootstrap 入门安装配置
Bootstrap 入门安装配置

共0课时 | 0人学习

38+ PhpStorm 提示和技巧
38+ PhpStorm 提示和技巧

共1课时 | 226人学习