现场是这样的。日志按扩展名统计,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

别只看报错消失,验证要多做一步。静态资源请求占比从四成降到一成五,文章页的日抓取量两周内回升三成,发版后的抓取波动消失。

静态资源本来就会被抓,但它们的地址必须稳定,版本号一变地址就变,等于每次发版都让蜘蛛重学一遍。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189