现场是这样的。日志按扩展名统计,css 和 js 请求占了总抓取的四成,其中大量带 ?ver= 参数,每次发版版本号一变就是一批新地址。文章页的抓取量同期在下降。
中间走过弯路,把「静态资源没有设置长缓存,蜘蛛反复回来重验证」当成主因,改完现象没变。
把日志和配置对完,能解释这个现象的基本就这几处。版本参数写在资源 URL 上,每次发版都生成新地址;合并与压缩插件给每个页面生成不同的资源组合;部分资源 404 后仍被页面引用,持续产生无效请求。
第一件事是按扩展名统计请求占比
awk '{print $7}' /var/log/nginx/access.log | grep -oE '\.[a-z]{2,4}(\?|$)' | sort | uniq -c | sort -rn | head
接着把版本参数从 URL 里去掉
add_filter('script_loader_src', function($s){ return remove_query_arg('ver', $s); });
给静态资源设长缓存
location ~* \.(css|js)$ { expires 30d; add_header Cache-Control 'public, immutable'; }
剩下的就是确认资源没有再返回 404
grep -c ' 404 ' /var/log/nginx/access.log
别只看报错消失,验证要多做一步。静态资源请求占比从四成降到一成五,文章页的日抓取量两周内回升三成,发版后的抓取波动消失。
静态资源本来就会被抓,但它们的地址必须稳定,版本号一变地址就变,等于每次发版都让蜘蛛重学一遍。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。
