一、为什么缓存对网站这么重要
网站加载慢、服务器带宽不够用,是站长最常遇到的两个问题。很多人的第一反应是升级服务器配置,但忽略了一个成本更低、效果更好的手段——缓存。
当用户访问一个网站时,浏览器需要下载 HTML、图片、CSS、JS 等资源。如果每次访问都要从源服务器拉一遍,服务器带宽会很快被打满,用户等待时间也会变长。
接入百度云防护 WAF 后,静态资源可以被缓存到 WAF 节点上。用户的请求直接由节点返回,不再回源到服务器,源服务器只需要处理动态请求即可。
一个常见的误区是:接入 WAF 后缓存会自动生效。 实际上不一定。
二、大部分站长遇到的问题
很多网站在接入百度云防护后,发现缓存命中率很低,甚至完全没有命中。去查了下才知道,WAF 默认遵循源站的缓存策略。
也就是说:
- 你的服务器设置了
Cache-Control: no-cache - WAF 严格遵循源站策略,不缓存
- 每次请求都回源到服务器
- 服务器带宽照常消耗,接入 WAF 只是多了层防护,没起到缓存加速的作用
这个问题在宝塔面板用户中尤其常见,因为宝塔部分版本的默认配置会输出 no-cache 响应头。
三、Cache-Control 响应头的工作原理
什么是 Cache-Control
Cache-Control 是一个 HTTP 响应头,告诉浏览器和 CDN 节点这个资源能不能缓存、能缓存多长时间。
Cache-Control: public, max-age=86400
上面这行的意思是:资源可以被公共缓存(CDN 节点)缓存,缓存有效期为 86400 秒(24 小时)。
关键参数说明
| 参数 | 含义 | 建议值 |
|---|---|---|
public | 允许所有缓存节点缓存 | 静态资源使用 |
private | 仅允许浏览器缓存,CDN 不缓存 | 动态页面使用 |
no-cache | 不缓存,每次都回源验证 | 不要对静态资源使用 |
max-age=秒 | 缓存过期时间 | 图片 86400(1 天),CSS/JS 604800(7 天) |
为什么攻击者会利用 no-cache
最近发现一类攻击:攻击者发送的请求头中携带 Cache-Control: no-cache,强制 CDN 节点回源拉取资源。如果源站没有限制回源频率,大量此类请求会直接把源站带宽打满。

启用节点缓存后,即使攻击者发送 no-cache 请求,已缓存的资源也仍然由节点直接返回,不会回源到服务器。 这是缓存策略在安全层面带来的额外收益。
四、在不同 Web 服务器上设置 Cache-Control
要让百度云防护 WAF 节点缓存静态资源,先要在源服务器上配置正确的响应头。
Nginx
找到网站配置文件(宝塔路径 /www/server/panel/vhost/nginx/你的域名.conf),在 server 块中添加:
nginx
location ~* \.(jpg|jpeg|png|gif|webp|svg|ico|css|js|woff|woff2|ttf|eot)$ {
expires 7d;
add_header Cache-Control "public, max-age=604800, immutable";
}
bash
# 重启 Nginx
nginx -s reload
参数说明:
expires 7d:设置过期时间为 7 天public:允许 CDN 和浏览器缓存max-age=604800:缓存有效期(秒),604800 = 7 天immutable:告诉浏览器该资源永远不会变,可以放心使用缓存(适用于带版本号的静态资源)
如果 CSS/JS 文件名不带版本号,去掉 immutable 参数:
nginx
location ~* \.(jpg|jpeg|png|gif|webp|svg|ico|css|js|woff|woff2|ttf|eot)$ {
expires 7d;
add_header Cache-Control "public, max-age=604800";
}
Apache
在 .htaccess 或虚拟主机配置中添加:
apache
<FilesMatch "\.(jpg|jpeg|png|gif|webp|svg|ico|css|js|woff|woff2|ttf|eot)$">
Header set Cache-Control "public, max-age=604800"
</FilesMatch>
bash
# 重启 Apache
systemctl restart httpd
IIS
IIS 通过 web.config 文件配置。在网站根目录的 web.config 中添加:
xml
<configuration>
<system.webServer>
<staticContent>
<clientCache cacheControlMode="UseMaxAge"
cacheControlMaxAge="7.00:00:00"
setEtag="true" />
</staticContent>
</system.webServer>
</configuration>
或者在 IIS 管理器中操作:
IIS 管理器 → 你的网站 → HTTP 响应标头
→ 添加:
名称:Cache-Control
值:public, max-age=604800
宝塔面板(图形化操作)
如果你的网站跑在宝塔面板上,可以直接在面板里设置,不用手动改配置文件:
宝塔面板 → 网站 → 你的域名 → 设置 → 配置文件
在 server 块中找到 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ 部分
将 expires 修改为 7d
将 add_header Cache-Control 修改为 "public, max-age=604800"
同样在 location ~ .*\.(js|css)?$ 部分也做同样的修改
然后重启 Nginx。
五、在百度云防护中开启缓存
配置完源服务器后,进入百度云防护控制台开启缓存功能。
步骤一:开启网页防篡改缓存
百度云防护控制台 → 防护配置 → Web 防护 → 网页防篡改
进入后找到缓存配置,开启缓存开关。

步骤二:配置缓存文件类型
在缓存规则中添加需要缓存的静态资源后缀。建议配置以下类型:
图片类:jpg, jpeg, png, gif, webp, svg, ico, bmp
样式类:css, less, scss
脚本类:js, jsx, ts, vue
字体类:woff, woff2, ttf, eot
媒体类:mp4, webm, ogg, flv
文档类:pdf, doc, docx, xls, xlsx
步骤三:配置缓存过期时间
根据资源类型设置合理的过期时间:
| 资源类型 | 建议缓存时间 | 说明 |
|---|---|---|
| 带版本号的 CSS/JS | 30-365 天 | 文件名含 hash 值 |
| 不带版本号的 CSS/JS | 1-7 天 | 更新后及时生效 |
| 图片(JPG/PNG/WebP) | 7-30 天 | 一般不频繁变动 |
| 字体文件 | 30-365 天 | 几乎不变 |
| 图标/Logo | 30-90 天 | 更新频率低 |
六、验证缓存是否生效
配置完成后,浏览器里看是否生效:
打开浏览器按 F12 → Network 标签
刷新页面,找到图片请求
看右侧 Response Headers:
有 Yjs-Cachestatus: HIT → WAF 缓存命中
没有这行 → 你没有开启在WAF开启缓存或者没有设置缓存这个后缀的文件
有这行但显示miss → 缓存没有命中,图片第一次加载或者缓存刷新导致,或者源服务器配置了Cache-Control:no-cache 禁止缓存,需要进入服务器修改响应头为:Cache-Control:public

七、缓存前后的数据对比
以一个日均 PV 5 万、图片资源占 60% 流量的资讯站为例:
| 指标 | 优化前 | 优化后 |
|---|---|---|
| 静态资源回源比例 | 100% | 约 10-20% |
| 源站带宽消耗 | 100 Mbps | 15-20 Mbps |
| 页面加载时间 | 3.2 秒 | 1.1 秒 |
| 服务器 CPU | 60-80% | 20-30% |
静态资源缓存是性价比最高的优化手段,不需要升级服务器配置,只需要修改几行配置就能达到明显效果。
