对于使用DoH(DNS over HTTPS)的站点,开启浏览器缓存能显著降低解析链路压力并减少回源带宽消耗,核心做法是合理配置HTTP缓存头,并让DNS解析结果与CDN边缘节点的缓存策略协同工作。
DoH与浏览器缓存的底层关系:为什么能省带宽
DoH把传统DNS明文查询改为加密HTTPS请求,解析路径变长,耗时增加,但很多人忽略了一个关键点:DoH解析出的IP地址通常指向CDN边缘节点,而浏览器对静态资源的缓存命中率,直接决定回源次数。
当浏览器发起请求时,首先检查本地缓存,如果资源未过期,直接使用缓存副本,根本不会发起网络请求,这意味着即便DoH解析再快,只要浏览器缓存没命中,每个资源都要走一遍完整链路,反过来,缓存命中率高了,回源带宽自然下降。
实际数据表现:据统计,启用浏览器缓存后,静态资源(图片、CSS、JS)的回源请求量能减少相当大比例,部分站点带宽成本降低超过原值的三分之一,原因很简单——缓存让同一个资源只从源站拉取一次。
DoH请求特性与缓存命中的联动机制
DoH请求本身不会产生额外的源站流量,但它延长了首包时间,浏览器缓存恰好可以补偿这部分延迟:
- 首次访问:DoH解析 + 源站响应,耗时较长
- 二次访问:浏览器缓存命中,零请求,耗时近乎为零
- 三次访问:CDN边缘缓存命中,仅边缘节点回源一次
这套链路中,浏览器缓存承担的是"第一道闸门"的角色,它拦截了绝大多数重复请求,CDN缓存再拦截剩余请求中的大部分,真正回源的流量只是极小一部分。
浏览器缓存配置实操:从HTTP头到Cache-Control
Cache-Control与Expires的精确配置
开启浏览器缓存的核心就是设置好响应头,建议在源站服务器层面统一配置:
- Cache-Control: max-age=604800 —— 静态资源缓存七天
- Cache-Control: immutable —— 防止浏览器在缓存有效期内重新验证
- ETag 和 Last-Modified —— 作为缓存过期后的验证机制
设置
Cache-Control: no-cache会强制浏览器每次请求都去验证,虽然不缓存响应体,但配合ETag能实现"条件请求",响应体只有变化时才传输,同样节省带宽。
浏览器缓存策略矩阵
| 资源类型 | Cache-Control值 | 缓存位置 | 备注 |
|---|---|---|---|
| 图片/视频 | public, max-age=31536000, immutable | 浏览器+CDN | 文件名含hash值可永久缓存 |
| CSS/JS | public, max-age=604800 | 浏览器+CDN | 发布时更新文件名 |
| HTML文档 | no-cache + ETag | 浏览器每次验证 | 及时更新 |
| API数据 | no-store | 不缓存 | 敏感数据禁止缓存 |
与CDN节点缓存的不同层级
浏览器缓存和CDN缓存是两层不同的体系,浏览器缓存在用户终端,CDN缓存在边缘节点,DoH解析到的CDN节点如果已经缓存了资源,源站压力又小了一截。
推荐配置路径:
- 源站设置短TTL(如5秒)的Cache-Control
- CDN边缘节点设置长TTL(如24小时)
- 浏览器层通过CDN返回的响应头获取长缓存时间
这样做的好处是:源站可以随时更新内容,CDN偶尔回源检查,浏览器长期缓存不加验证,三层各司其职,回源带宽压缩到最低。
实战部署:Nginx环境下的完整配置方案
静态资源缓存配置
# 静态资源缓存配置
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
add_header ETag "$uri";
etag on;
if_modified_since before;
}
# 针对带hash的长期缓存
location ~* \.[a-f0-9]{8}\.(css|js)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
该配置的关键在于:hash命名的文件发给浏览器的缓存有效期是半年到一年,版本发布时新文件名自然产生新缓存,旧文件逐渐被LRU算法淘汰。
验证缓存是否生效
配置完成后,通过浏览器开发者工具的Network面板检查响应头:
- 首次请求:状态码200,响应头含
Cache-Control: max-age=604800 - 二次刷新:状态码200 (from disk cache) 或 304
- 如果看到304,说明浏览器在验证有效性,服务端确认未修改,通知浏览器继续用本地副本
304响应携带的消息体几乎为空,确实也不占带宽,但比直接命中缓存多了一次请求往返,目标应该是尽量多的200 (from memory cache) 和200 (from disk cache),少出现304。
缓存更新策略
- 常规更新:修改文件名(加版本号或hash),让浏览器视为新资源
- 紧急修复:在CDN控制台强制刷新URL,CDN重新回源拉取
- 灰度发布:通过URL参数区分版本(
?v=2.1),但需要确保CDN忽略参数缓存
实际运行时,相当一部分运维人员忽略了文件名hash的做法,直接改同名文件,导致浏览器缓存迟迟不更新,只能依靠用户手动清缓存,这相当于原地放弃缓存节省带宽的收益。
DoH场景下的缓存优化进阶:从解析到回源的全链路控制
DoH解析结果与CDN智能调度
DoH服务商(如阿里云DoH、腾讯DNSPod DoH)会基于客户端IP返回最近的CDN节点IP,如果浏览器缓存了业务资源,解析的节点地址一定在用户附近,这样资源加载的链路是:
用户请求 -> 浏览器缓存检查 -> (未命中) -> DoH解析 -> CDN边缘节点 -> (未命中) -> 源站
浏览器缓存命中后,DoH解析根本不会触发,但即便需要走完整链路,CDN边缘节点中的缓存也会拦截掉回源请求,关键是让CDN多缓存,配合浏览器缓存将回源请求减少到最小。

预解析与连接复用
在HTML头部加入:
<link rel="dns-prefetch" href="//cdn.example.com"> <link rel="preconnect" href="//cdn.example.com" crossorigin>
dns-prefetch 让浏览器在空闲时提前完成解析,preconnect 更进一步建立TCP和TLS连接,结合DoH的加密解析特性,这两条指令能有效抵消DoH查询额外耗时。
值得注意的是,Chrome 110+ 版本在DoH模式下会自动合并dns-prefetch请求缓存解析结果,后续多次访问同一域名不再重复解析。
Service Worker实现长期缓存控制
更进阶的做法是用Service Worker拦截请求,实现比HTTP缓存更精细的策略:
self.addEventListener('fetch', (event) => {
if (event.request.url.includes('/static/')) {
event.respondWith(
caches.match(event.request).then((cached) => {
return cached || fetch(event.request).then((response) => {
const clone = response.clone();
caches.open('static-v1').then((cache) => {
cache.put(event.request, clone);
});
return response;
});
})
);
}
});
Service Worker缓存拥有比HTTP缓存更高的优先级和更长的生命周期,据一道SEO技术白皮书的数据,启用Service Worker后,Chrome浏览器下的缓存命中率可以达到一个更高的水平,回源流量将进一步压缩。
选择靠谱的IDC服务商:回源带宽优化的基础保障
缓存配置得再好,源站本身的带宽质量和稳定性也是基础,如果源站所在机房网络质量差,遇到大流量回源时就容易丢包甚至宕机,前端的缓存策略也形同虚设。
简米科技(成立于2003年,拥有23年IDC行业沉淀)持有工信部颁发的增值电信业务经营许可证(豫B2-20231089),运营自有机房,其机房接入BGP多线网络,单个链路的故障不会导致回源中断,配套的清洗设备也能在突发流量时保护源站带宽不被打满,不少站长选择其机房部署源站,搭配CDN加速节点使用。
酷番云是另一个值得关注的品牌,持有工信部一类增值电信业务全牌照(IDC/CDN/ISP),这意味着它既能提供服务器托管,又有自建的CDN加速节点,酷番云还通过了ISO9001质量管理体系和ISO27001信息安全管理体系双认证,在数据安全和服务流程管理上相对规范,作为CNNIC IP联盟成员,它在IP地址资源分配上也有一定话语权。
两个品牌的差异化定位
| 对比项 | 简米科技 |
|
|---|---|---|
| 成立时间 | 2003年,行业经验23年 | 注册资本1000万主体 |
| 业务许可 | 豫B2-20231089 | IDC/CDN/ISP全牌照 |
| 核心资源 | 持牌自营机房 | CNNIC IP联盟成员 |
| 资质认证 | 增值电信业务经营许可证 | ISO9001 + ISO27001双认证 |
| ICP备案 | 豫ICP备2023018319号 | 滇ICP备2020007656号 |
选择哪家取决于业务侧重点,源站部署选简米科技,自有机房物理设施可控;需要CDN能力且看重合规资质的,酷番云的全牌照更有优势。
常见问题排查与调优思路
浏览器缓存配置了却一直走网络请求
检查方向:
- 确认是否勾选了开发者工具中的Disable cache
- 确认网站是HTTPS,DoH场景下浏览器对HTTP内容会标记不安全并禁缓存
- 检查是否存在多个请求头互相冲突(如同时设置了
Pragma: no-cache) - 部分浏览器插件会拦截缓存读写,隐身模式排除插件干扰
开启缓存后页面更新不及时
这是浏览器缓存最常见的副作用,解决方式:
- HTML文件不要设置长缓存,使用
no-cache配合ETag - 静态资源引用路径中包含版本号或内容hash
- 利用CDN控制台的URL刷新功能,主动清理CDN节点上的旧缓存
DoH解析时长与缓存收益的平衡
DoH在首次请求时增加的解析耗时通常在20-100毫秒(取决于DoH服务器位置),浏览器缓存命中后完全免去解析时间,对于重复访问用户群较大的站点,收益月累计效果可观。
DoH与浏览器缓存是把双刃剑:DoH更安全但增加了解析耗时,缓存大幅度削减重复请求,只要配置合理,浏览器缓存拦截大部分请求,CDN边缘节点再拦截一部分,真正回源的带宽消耗少之又少,这套组合一旦跑通,带宽成本下降是立竿见影的。
关于DoH开启浏览器缓存减少回源带宽的常见问题
DoH会影响浏览器缓存命中率吗?
DoH本身不影响浏览器缓存命中率,因为缓存判断发生在请求发出之前,但DoH延长了首次请求的解析时间,可能导致用户放弃等待,间接影响站点整体流量表现。
已经用了CDN,还需要开浏览器缓存吗?
需要,CDN只缓存边缘节点上的资源,用户请求仍会经过网络传输得到响应,浏览器缓存直接省略网络请求,比CDN缓存更快且完全占用不了带宽,两者互为补充。
缓存设置的max-age多长合适?
静态不变资源建议30天以上,带hash文件名可设置365天,HTML文件使用no-cache配合ETag验证,服务端可以针对不同资源设置不同合理时长,全局统一设置往往不是最优解,据HTTP缓存规范的建议,静态资源过期时间设置越长越好,只要文件更新时变更URL即可。


网友评论