HTTP/2本身不改变缓存逻辑,但需结合精准分层缓存策略实现“秒开”:Apache启用mod_http2和HTTPS,在443虚拟主机中配置Protocols h2 http/1.1;HTML设短缓存(max-age=600),静态资源设长缓存+immutable并配合文件哈希,禁用Server Push,改用preload提示关键资源。

HTTP/2 本身不改变缓存逻辑,但能显著提升资源并行加载效率;真正实现“秒开”的关键,在于把 HTTP/2 的多路复用优势,和精准、分层的静态资源缓存策略结合起来——重点不是开启 HTTP/2,而是让浏览器一次加载就命中所有缓存,不再发起多余请求。
确保 HTTP/2 基础就绪
Apache 必须启用 mod_http2,且使用 HTTPS(HTTP/2 在主流浏览器中强制要求 TLS)。确认已配置有效证书,并在虚拟主机中启用协议:
- 启用模块:
sudo a2enmod http2 - 在
<VirtualHost *:443>块中添加:Protocols h2 http/1.1 - 重启服务:
sudo systemctl restart apache2 - 用浏览器开发者工具的 Network 面板检查协议列是否显示
h2
HTML 与静态资源缓存必须严格分离
HTML 文件内容常变,不能长缓存;而 CSS、JS、字体、图片等应设为长期可缓存。否则浏览器每次都要重验 HTML,失去“秒开”意义:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
HTML 缓存策略:设为短时效 + 强校验,例如
Cache-Control: public, must-revalidate, max-age=600(10 分钟),配合 ETag 或 Last-Modified -
CSS/JS/字体/图片缓存策略:设为一年 + immutable,例如
Cache-Control: public, immutable, max-age=31536000;浏览器一旦缓存,连条件请求(If-None-Match)都跳过 - 推荐用
mod_expires+mod_headers组合配置,比单靠 Expires 更可靠
利用文件名哈希解决更新失效问题
标记 immutable 后,浏览器不会主动检查更新——所以你必须让资源 URL 随内容变化。常见做法:
- 构建时给静态资源加哈希后缀,如
app.a1b2c3.css、logo.f4e5d6.png - HTML 中引用带哈希的路径(通过构建工具或模板自动注入)
- Apache 不需重命名文件,只需按扩展名统一设置 long cache,例如匹配
\.(css|js|woff2|png)$ - 这样每次内容变更,URL 就不同,浏览器自然加载新版本,旧缓存仍有效且互不干扰
避免 Server Push(除非有明确收益)
HTTP/2 支持服务端推送,但 Apache 默认不启用,且实际中容易造成资源冗余或阻塞:
- 现代浏览器对 Push 支持不一,Chrome 已逐步弃用,Firefox 限制严格
- Push 会抢占连接带宽,反而拖慢关键资源(如首屏 CSS)的传输
- 更稳妥的做法是:HTML 中用
<link rel="preload">显式提示关键资源,由浏览器自主调度 - 除非你完全掌控客户端行为且压测验证过收益,否则不建议开启 Push

















