问题出现得很突然,日志倒是留得挺全。侧栏热门文章模块输出三十条链接,全站每页都有,三万篇文章加起来是九十万条重复内链,蜘蛛在日志里对同一批地址每天请求数千次。
刚开始盯着「热门列表按访问量排序,地址集合长期不变」,折腾了半个多小时,排掉了。
原因不止一个,得分开看。热门模块没有做去重,同一链接出现在每个页面。少数情况下是侧栏链接优先级和正文相同,没有 nofollow 或延迟加载。
另外,移动端和桌面端各渲染一份,重复翻倍。
动手时先统计单个页面里指向同一地址的链接数
curl -s https://www.example.com/post/1024 | grep -o 'href="/post/[0-9]*"' | sort | uniq -c | sort -rn | head
然后把侧栏热门改成随机抽取并限制条数
add_filter('widget_posts_args', function($a){ $a['posts_per_page'] = 8; $a['orderby'] = 'rand'; return $a; });
移动端复用同一份 DOM 不再重复输出
curl -s -A 'Mozilla/5.0 (iPhone)' https://www.example.com/post/1024 | grep -c 'widget-hot'
末了对侧栏链接加 rel=noopener 并按需 nofollow
grep -c 'rel="nofollow"' templates/sidebar.php
怎么算真的好了,看的是同一批现象。单页里指向同一地址的链接不超过两条,侧栏条数降到八条,日志里对热门页的重复请求明显减少。
补一句。全站重复模块的链接预算要算总量,三十条乘以三万页是九十万,蜘蛛再勤也消化不了。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。
