apache不识别爬虫身份,但可通过user-agent等特征标记爬虫请求(如setenvifnocase匹配googlebot等),隔离至独立缓存区(cacheenable disk / env=is_crawler),并定制缓存策略:延长过期时间、忽略set-cookie、禁用私有缓存、注入public cache-control头,同时排除敏感路径与查询参数,保障安全与性能。

识别并标记爬虫请求
Apache 不自带爬虫数据库,但可通过 `mod_setenvif` 或 `mod_rewrite` 提取常见爬虫标识:用 SetEnvIfNoCase 匹配主流 User-Agent 关键词:
SetEnvIfNoCase User-Agent "Googlebot|Bingbot|YandexBot|DuckDuckBot|AhrefsBot|SemrushBot|MJ12bot" is_crawler=1-
SetEnvIfNoCase User-Agent "crawler|spider|bot" is_crawler=1(宽泛匹配,慎用) - 排除误判:加条件过滤真实用户(如含 Chrome/Firefox/Safari 的 UA 不设 is_crawler)
也可结合请求头判断,例如检查是否带 X-Forwarded-For + 无 Cookie,或是否缺失 Accept-Language 等人为特征。
为爬虫请求启用专用缓存区域
避免爬虫缓存污染普通用户缓存,建议单独定义缓存路径和规则:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 指定独立缓存根目录:
CacheRoot "/var/cache/apache2/crawler" - 启用磁盘缓存时绑定环境变量:
CacheEnable disk / env=is_crawler - 这样只有被标记为
is_crawler=1的请求才会进入该缓存区
示例配置片段:
<ifmodule mod_cache.c><ifmodule mod_cache_disk.c> CacheRoot "/var/cache/apache2/crawler" CacheDirLevels 2 CacheDirLength 1 CacheIgnoreHeaders Set-Cookie Vary CacheIgnoreNoLastMod On CacheDefaultExpire 3600 CacheMaxExpire 86400 </ifmodule></ifmodule><location> CacheEnable disk / env=is_crawler </location>
定制爬虫缓存行为
爬虫对时效性、一致性要求与用户不同,需针对性调整:
-
延长缓存时间:设
CacheDefaultExpire 7200(2小时)或更长,降低源站压力 -
忽略动态头:用
CacheIgnoreHeaders Set-Cookie Cache-Control Expires,防止后端响应头干扰缓存判定 -
禁用私有缓存:加
CacheStorePrivate Off,确保爬虫缓存可复用(除非页面明确含用户态) -
强制 public 缓存头:配合
mod_headers统一注入:Header set Cache-Control "public, max-age=7200" env=is_crawler
安全与兜底控制
爬虫缓存必须防范两类风险:缓存敏感内容、缓存失效滞后:
-
禁止缓存登录/管理路径:
<locationmatch>CacheDisable on</locationmatch> -
跳过带查询参数的个性化页:
CacheIgnoreQueryString On(默认关闭,爬虫场景建议开启) -
设置缓存锁防并发写冲突:
CacheLock on、CacheLockPath "/tmp/crawler_cache_lock" -
定期清理旧缓存:用 cron 脚本定期运行
find /var/cache/apache2/crawler -type f -mtime +7 -delete
/var/cache/apache2/crawler 目录赋予 www-data:www-data 权限,并确保磁盘空间充足。










