条件请求是浏览器在协商缓存阶段向服务器发送带If-None-Match或If-Modified-Since头的HTTP请求,用于验证本地HTML缓存是否有效;它不触发于强缓存(如max-age>0),仅当服务端响应含no-cache或max-age=0且提供ETag/Last-Modified时才生效,是确保HTML更新被用户及时获取的关键机制。

什么是条件请求?它和HTML缓存有什么关系
条件请求不是“给HTML加个属性就能开”,而是浏览器在发起HTTP请求时,主动带上验证类请求头(比如If-None-Match或If-Modified-Since),让服务端判断本地缓存是否还能用。它只在协商缓存阶段生效——也就是说,前提是HTML响应头里没走强缓存(比如Cache-Control: max-age=3600直接命中内存缓存,压根不发请求)。
对HTML文件来说,条件请求是防止用户卡在旧版本的最后防线:你改了首页内容,但用户没强制刷新,浏览器仍会发一次带验证头的请求,服务端比对后返回304 Not Modified(复用缓存)或200 OK(下发新HTML)。
怎么让浏览器对HTML发起条件请求
关键不在前端写什么标签,而在服务端返回的响应头是否允许协商。必须同时满足两个条件:
-
Cache-Control不能设成max-age大于0的强缓存(例如max-age=3600),否则浏览器直接读缓存,不发任何请求 - 响应头中必须提供至少一个校验依据:
ETag(推荐)或Last-Modified
常见有效配置示例:
Cache-Control: no-cache ETag: "abc123"
或
Cache-Control: max-age=0, must-revalidate Last-Modified: Wed, 09 Oct 2026 12:00:00 GMT
注意:no-cache ≠ “不缓存”,它明确要求每次使用前必须验证;而max-age=0, must-revalidate语义更严谨,兼容性也略好。
将 Markdown 文章转换为微信公众号兼容的纯 HTML 格式。当用户要求"转成微信格式"、"生成公众号文章 HTML"、"排版到微信草稿箱"、"微信粘贴格式"时触发。输出带内联样式的纯 HTML,微信编辑器可直接渲染,无需额外适配。支持标题、段落、列表、粗体、行内代码、表格、引用块、代码块、配图的完整转换。
为什么<meta http-equiv="Cache-Control">不管用
这个标签在现代浏览器(Chrome/Firefox/Safari/Edge)中完全被忽略——它不参与HTTP请求流程,也不会触发If-None-Match或If-Modified-Since的发送。你写上<meta http-equiv="Cache-Control" content="no-cache">,DevTools 的 Network 面板里照样看不到任何验证头,服务端也收不到条件请求。
真正起作用的只有服务端返回的HTTP响应头。Nginx、Apache、Express、Vercel等平台都需在HTML资源的响应路径上显式设置:
- Nginx:
add_header Cache-Control "no-cache";+add_header ETag "xxx";(ETag通常由模块自动生成) - Express:
res.set('Cache-Control', 'no-cache').set('ETag', '"xyz"'); - Vercel:
_headers文件中对/index.html匹配行写cache-control: no-cache
验证条件请求是否真的发出
别靠F5刷新或地址栏回车判断——它们可能走from memory cache,根本不出网。正确验证步骤:
- 打开 DevTools → Network 标签页
- 勾选 Disable cache(确保不干扰)
- 按
Ctrl+R(普通刷新,不是强制刷新) - 找到你的
index.html请求 → 点开 → 查看 Request Headers 面板
如果看到If-None-Match: "abc123" 或 If-Modified-Since: Wed, 09 Oct 2026 12:00:00 GMT,说明条件请求已发出;再看 Response Headers 里是否有ETag或Last-Modified,以及 Status 是否为304 Not Modified。
最容易被忽略的一点:本地开发用file://协议打开HTML时,整个HTTP机制不存在,条件请求无从谈起——那不是缓存问题,是环境问题。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










