mod_cache_socache不支持按地理位置差异化缓存,仅存储缓存元数据;差异化缓存需通过CacheKeyBase引入地理头(如Geographic-Country)并配合mod_cache_disk存储响应体。

mod_cache_socache 本身不支持按地理位置变量(如 IP 归属地、X-Forwarded-For 地区头)做差异化缓存。它只负责在共享内存中高速存储和检索缓存元数据(ETag、过期时间、状态等),不参与缓存键(cache key)的生成逻辑,也不解析或响应地理信息字段。
缓存键由 mod_cache 决定,而非 mod_cache_socache
Apache 的缓存是否“差异化”,取决于 CacheKeyBase、CacheIgnoreURLSessionIdentifiers 和 CacheIgnoreHeaders 等指令如何构造缓存键,而 mod_cache_socache 只是把最终生成的键对应的元数据存进共享内存——它不读请求头、不判断地域、不修改键值。
若要实现按地理位置缓存不同内容,关键在两步:
- 让 Apache 在生成缓存键时,显式包含地理标识(例如从
X-Country或GeoIP-Country-Code头提取) - 确保后端或前置代理(如 Nginx、CDN)已将地理信息注入请求头,并且该头未被
CacheIgnoreHeaders屏蔽
实际配置要点
假设你已通过 mod_geoip2 或类似模块将国家码写入 Geographic-Country 请求头,可按如下方式启用差异化缓存:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 启用
mod_cache+mod_cache_disk(必须,因需缓存响应体)+mod_cache_socache(加速元数据查检) - 关闭快速处理器:
CacheQuickHandler off(全局生效,不可放在 Location 块内) - 用
CacheKeyBase引入地理头:CacheKeyBase "%{Geographic-Country}e",使缓存键带上国家维度 - 确保该头不被忽略:
CacheIgnoreHeaders中不要包含Geographic-Country - 为避免 Cookie 干扰共享缓存,仍建议加:
CacheIgnoreHeaders Set-Cookie
为什么不能只靠 mod_cache_socache?
即使你把 CacheSocache shmcb 配得再大、再快,它依然只存“这个 URL+这个 Country 头值”是否已缓存、是否过期——真正区分内容、存储 HTML 片段或 JSON 数据的,是 mod_cache_disk(或自定义存储后端)。socache 是索引层,不是内容层。
若跳过磁盘/内存主体缓存,仅启用 socache,所有请求仍会穿透到后端,地理差异化就无从谈起。
验证是否生效
发起两个来自不同国家的相同 URL 请求(可用 curl 模拟头):
curl -H "Geographic-Country: CN" -I https://yoursite.com/api/datacurl -H "Geographic-Country: US" -I https://yoursite.com/api/data
观察响应头:X-Cache: HIT 表示命中,X-Cache-Key 响应头(需开启 CacheIgnoreHeaders 以外的调试)应显示含国家码的完整键;同时检查磁盘缓存目录下是否生成了不同子路径(如 cn/xxx.data 和 us/xxx.data)。

















