瓦片缓存 30 天不清,改了配色用户看到的还是旧图
服务端已经重新切片,本地开发清缓存也没用,用户那边照样是两周前的底图。
现象
GeoServer 里改了 SLD 配色,重新生成了瓦片。
本地 Ctrl+F5 后看到的是新配色,
但线上用户反馈仍是旧版,持续了三天。
响应的缓存策略是 Cache-Control: max-age=2592000,
即 30 天,URL 里没有任何版本号。
原因
max-age 期间浏览器不会再发请求验证,
直接从磁盘缓存读取。URL 不变,浏览器就认为资源没变,
服务端即使已经更新,客户端也拿不到。
瓦片类资源本来就适合长缓存,但前提是URL 可版本化:
/tiles/v1/{z}/{x}/{y}.png 改成
/tiles/v2/...,版本号一变,自然获得新资源。
| 策略 | 效果 | 适用 |
|---|---|---|
max-age=2592000 + 无版本 | 30 天内不请求 | 不推荐 |
max-age=31536000 + 版本路径 | 长缓存且可更新 | 推荐 |
no-cache | 每次验证,命中 304 | 调试期 |
no-store | 完全不缓存 | 不推荐,流量翻倍 |
排查过程
- 在开发者工具里选中瓦片,看
Size列是否显示(disk cache)。 - 看响应头
Date与Age,判断缓存已存放多久。 - 在地址后加随机参数
?v=2请求一次,若立即出现新图,确认是缓存问题。 - 检查是否有 CDN 层额外缓存,CDN 的
Age也需要清。
# 跳过缓存验证服务端内容
curl -H "Cache-Control: no-cache" -I https://tile.example.com/10/843/392.png
# 响应头示例
# Cache-Control: public, max-age=2592000
# Age: 1296000 <- 已缓存 15 天
解决方案
在 URL 里加版本号,并配合长缓存。版本号变更时旧瓦片仍可用,不需要强制刷新。
# Nginx:按版本目录设置长缓存
location ~ ^/tiles/v(\d+)/ {
root /var/www/tiles;
expires 1y;
add_header Cache-Control "public, max-age=31536000, immutable";
}
# 未版本化的旧路径改为短缓存,给迁移留缓冲
location /tiles/ {
expires 1h;
add_header Cache-Control "public, max-age=3600, must-revalidate";
}
// 前端:把版本常量集中管理,发版时只改一处
const TILE_VERSION = 'v3';
L.tileLayer(`https://tile.example.com/tiles/${TILE_VERSION}/{z}/{x}/{y}.png`, {
maxZoom: 18,
tileSize: 256
}).addTo(map);
// 应急:给已加载的图层强制重载(只对当前会话有效)
layer.setUrl(`https://tile.example.com/tiles/v3/{z}/{x}/{y}.png?t=${Date.now()}`);
Ctrl+F5 只影响当前浏览器。让已发布的长缓存 URL 失效,
唯一可靠的办法是换 URL,服务端改头对已经缓存过的客户端无效。
验证
新版本 URL 首次请求返回 200 与新图,再次请求命中缓存返回
200 (from disk cache);旧版本 URL 仍能访问,不影响回滚。
const urls = performance.getEntriesByType('resource')
.map(e => e.name).filter(n => n.includes('/tiles/'));
console.assert(urls.every(u => u.includes('/tiles/v3/')), '仍有旧版本瓦片请求');
适用版本
| 组件 | 版本 | 说明 |
|---|---|---|
| HTTP/1.1 缓存规范 | RFC 9111 | immutable 避免验证请求 |
| Nginx | 1.20 及以上 | expires 与 add_header 可覆盖 |
| Cloudflare | — | Purge 只清 CDN,清不掉浏览器 |
| GeoServer GWC | 2.20 及以上 | 自身也有瓦片缓存,需 Seed/Truncate |
经纬志(2026)。《瓦片缓存 30 天不清,改了配色用户看到的还是旧图》。https://www.jingweizhi.com/cookbook/tile-cache-maxage.html(访问日期 2026-11-03)。