问题出现得很突然,日志倒是留得挺全。筛选页的 canonical 把全部参数原样带上,最长一条 2400 字符。日志里蜘蛛请求的地址到 2000 字符就断了,返回 414,GSC 报网址过长,这批页面一直不进索引。

刚开始盯着「CDN 对超过 2048 字符的 URL 直接返回 414」,折腾了半个多小时,排掉了。

真正麻烦的地方在于,几个原因的现象几乎一样。canonical 直接复制了当前地址,没有做参数裁剪。还有一种是Nginx 的 large_client_header_buffers 默认只到 8k,超长请求被拒。

另外,页面本身允许无限制叠加筛选参数。

量一下 canonical 的长度

curl -s https://www.example.com/list | grep -o 'rel="canonical"[^>]*' | wc -c

只保留有意义的参数

canonical = base + '?' + '&'.join(sorted(keep_params))

给参数数量设上限

if len(params) > 3: return noindex()

调大请求头缓冲并复验

large_client_header_buffers 4 16k;

这台环境是别人交接的,不少默认值被动过,只能一项项核。

别只看报错消失,验证要多做一步。canonical 长度稳定在 300 字符以内,蜘蛛请求不再返回 414,筛选页开始正常进索引。

超长 URL 从生成那一刻就该被裁掉,等到蜘蛛返回 414 时,这批页面已经浪费了几周预算。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189