404 not found 表示服务器收到了请求,但找不到与这个地址对应的资源。当 URL 参数可以无限组合时,问题不在于每个 404 页面本身,而在于你无法再用“页面是否存在”来判断地址是否有效。此时更可操作的做法是:先把有效地址集合定义为一份可枚举、可验证的规则,而不是定义为“所有能返回 200 的地址”。
第一种条件:参数只影响展示方式,不影响资源本身。例如排序、每页条数、会话标识这类参数,地址集合应当收敛到一个规范形式,其余组合要么重定向到规范形式,要么返回 404,而不是各自返回一份内容。第二种条件:参数确实决定资源身份,例如筛选条件组合出的是不同数据集。这时不能简单收敛,需要为可索引的组合建立有限白名单,白名单之外的组合返回 404 或 410,并明确哪些组合值得被收录。
判断依据可以看三点:参数是否改变主体内容、组合数量是否可控、组合是否会被外部链接或站点内部引用。三点都指向“展示方式”时选收敛;只要有一点指向“资源身份”且组合可枚举,选白名单。
一个可执行的顺序是:先列出参数的语义分类,再为每类参数写出允许值或允许范围,最后把规则落成一份机器可读的清单。例如假设一个筛选页有颜色、尺寸、材质三个参数,颜色 8 个值、尺寸 5 个值、材质 4 个值,全组合是 160 个。如果只有颜色与尺寸的组合会被站内链接引用,那么有效集合可以定义为“颜色 × 尺寸”的 40 个组合,材质参数只在有值时参与,否则视为无效参数。
这份清单的作用是:当请求参数不在清单内时,返回 404 而不是返回一个空结果的 200 页面。动作的结果会直接影响下一步——如果无效组合返回 200,抓取工具会把这些地址当作可访问资源继续发现更多组合,有效集合的边界就永远收不住;如果返回 404,后续只需要监控这些 404 是否来自站内错误链接。
出现与直觉相反的结果时,不要只看 404 数量上升就断定处理正确。抓取量或某个统计归零,可能有多种合理解释:服务器临时限制、日志采样变化、抓取预算转移,或者外部链接减少。可核对的证据包括:请求参数是否落在你定义的清单内、返回状态码是否与规则一致、站内链接是否指向了清单外的组合。
robots.txt 的抓取限制不等于可靠的索引移除,站点地图也不保证收录。因此不要用 robots.txt 去“屏蔽”无限参数组合,那只是阻止抓取,不会让已存在的地址从索引中消失。有效地址集合的边界应由状态码和规范规则来定义。
实施时,先为参数建立允许值表,再在服务端做校验:命中清单返回正常内容,未命中返回 404。同时把站内链接限制在清单内,避免自己制造清单外的地址。做完这一步后,观察 404 的来源分布:来自站内链接的 404 需要修链接,来自外部或历史地址的 404 可以保留。
例外情况是:某些参数组合虽然不在清单内,但已经被大量外部链接引用,且内容确实有独特价值。这时不应直接返回 404,而应评估是否把它加入有效集合,或重定向到最接近的有效地址。另一个例外是分页参数,它通常不属于资源身份,但也不应全部返回 404,应保留可抓取的分页并规范其余组合。
最终,有效地址集合的定义应当能回答一个具体问题:给定任意参数组合,它是否属于你愿意维护和展示的资源。如果答案是否定的,404 是比空结果 200 更诚实的信号,也更有利于后续判断哪些地址值得继续处理。