问题出现得很突然,日志倒是留得挺全。筛选页的 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 时,这批页面已经浪费了几周预算。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
