先给一个有条件的结论:当查询参数可以被任意排列、重复或填入无意义值时,有效地址集合不能靠“穷举所有能返回200的URL”来定义,而应由站点主动声明一组规范参数及其合法取值,其余组合一律视为同一资源的非规范变体。这个结论成立的前提是,参数只影响展示方式或筛选维度,不指向彼此独立的内容实体;一旦某个参数决定的是不同商品、不同文档或不同权限下的数据,这个结论就会失效。
参数组合的空间是乘法关系:三个参数各有十种取值就是一千个地址,再加一个参数就变成一万个。如果以服务器是否返回200来判定有效性,那么任何接受任意参数、忽略未知参数的框架都会把全部组合标成有效,集合等于无限。更麻烦的是,同一份内容会以几十种参数顺序出现,每种都返回200,但用户看到的页面完全相同。
此时“404 not found是什么意思”这个问题的答案要分两层看:对用户,它表示请求的地址没有对应资源;对站点,它是一次明确的否定信号,说明该地址不属于有效集合。反过来,返回200并不等于地址有效,只说明服务器愿意响应。把这两个信号混为一谈,是参数型地址失控的起点。
开发、SEO和产品对“哪些地址算有效”经常各说各话。开发看路由是否命中,SEO看是否有独立内容和搜索价值,产品看用户是否可能通过界面到达。分歧本身不可怕,可怕的是没有共同的核对清单。下面这组问题可以直接拿去对齐:
把每个参数逐条过一遍,输出一张表:参数名、是否影响内容、取值是否有限、是否有界面入口、是否允许被索引。这张表就是有效地址集合的定义依据,而不是事后从日志里反推。
假设一个列表页原本只有?sort=price、?sort=date、?sort=rating三种排序,取值有限、界面可达、内容主体不变。此时可以把这三个地址视为同一资源的变体,用规范标签指向无参数版本,并允许抓取以便发现新内容。
后来产品加入?q=自由搜索框和?tag=任意标签输入。取值集合从三个变成无限,且不同q值可能命中完全不同的结果页。这时原来的处理方式不再适用:如果继续对全部组合返回200并允许索引,有效集合就无法定义;如果一律返回404,又会把用户真实可达的搜索结果页变成错误页。可区分的做法是给自由输入类参数设边界,例如只对命中结果数超过某个阈值的组合返回正常页面,其余返回无结果提示或重定向到上级列表,并在站内不生成指向空结果的链接。这个阈值是假设性的,具体数值要靠实际日志和内容规模验证,不能照搬。
如果参数指向的是彼此独立的内容实体,上面“规范参数加合法取值”的做法就会失效。典型情况是电商的变体地址:?color=red和?color=blue对应不同库存、不同图片、不同价格,甚至不同评价。这类地址各自具备独立搜索价值,不能合并成一个规范地址,也不该被当作重复内容清理。判断标准不是参数形式,而是该地址能否独立满足一个明确的用户查询意图。能,就单独定义;不能,就归入变体集合。
另一个反例是权限或会话参数。这类参数一旦进入可索引地址,会同时带来内容泄露和地址爆炸两个问题。它们不属于有效地址集合,也不该出现在任何对外链接中,处理方式是拒绝索引并避免生成,而不是靠404来兜底。
把参数表定稿后,立刻做一件事:在服务端对未列入白名单的参数组合统一返回明确的否定状态,而不是返回200加空内容。这个动作会直接改变下一步的监测口径——日志里404的数量会上升,但上升本身不能证明处理正确,因为它同样可能来自外链失效、旧地址迁移或爬虫拼接。要区分这些原因,需要同时看被否定地址的来源、参数形态和是否曾被站内链接过。
随后再决定哪些地址进入站点地图、哪些只允许抓取不允许索引。站点地图不保证收录,robots.txt的抓取限制也不等于可靠的索引移除,这两点会影响你对结果的预期。规则冻结之前,任何基于日志的“有效地址”统计都只是对当前实现的事后描述,不是定义。