当子域、路径或查询参数可以任意组合时,有效地址集合不可能靠枚举定义。可行做法是先确定地址是否必须被唯一解析,再选择规则约束还是运行时判定:前者把集合压成有限模式,后者接受集合开放但要求解析结果可预期。
如果每个地址都必须指向确定内容,集合就应当封闭,适合用规则约束。典型条件是:地址由程序按固定模板生成,参数取值来自有限枚举,且不存在用户自由拼接的入口。此时把合法组合写成模式清单,让解析层在进入业务逻辑前完成匹配,未命中直接返回统一状态码。
如果地址允许用户或外部系统自由构造,集合就是开放的,强行封闭会不断被新组合击穿。此时应改为运行时判定:先解析出资源标识,再判断该标识是否存在。参数只作为资源定位的输入,不参与地址合法性定义。
两种选择成立的条件可以这样区分:
选择之后要观察拒绝记录的变化。如果规则约束上线后拒绝量持续上升,说明有未纳入枚举的合法入口,下一步应补充模式而不是收紧规则;如果运行时判定的不存在比例长期偏高,说明地址生成侧存在无效链接,下一步应回到生成端修复。
假设某站点允许 /item/{id}?lang={code}&view={mode} 三种参数自由组合。若 lang 只有两种取值、view 只有三种,组合上限为六种,适合用规则约束并逐一验证。若 id 由外部系统提供且数量持续增加,则地址集合的规模由 id 决定,此时应把 id 是否存在交给数据层判断,lang 和 view 只做取值校验。这个例子的数字仅用于说明比较方法,不代表任何实际站点的规模。
出现与直觉相反的结果时,不要只凭请求量或抓取量下结论。请求量归零可能来自规则拦截、解析失败、上游不再生成链接,也可能只是采集周期变化;抓取量上升也可能来自参数组合被外部大量拼接,而非有效地址增加。
可核对的证据包括:解析层拒绝记录中命中的模式、资源查询返回不存在的比例、地址生成端产出的链接样本。三者指向不同原因:拒绝记录集中在少数模式,说明规则过窄;不存在比例高且样本分散,说明生成端失控;两者都正常而抓取仍异常,则应检查是否存在外部拼接来源。
需要说明的是,robots.txt 的抓取限制不等于可靠的索引移除,站点地图也不保证收录。把无效组合写进 robots.txt 只能减少抓取,不能替代地址集合本身的定义;站点地图提交同样不会让无效地址变为有效。
存在两类例外。第一,地址需要长期稳定且可被外部引用时,即使参数会增长,也应优先固定路径结构,把可变部分收敛到单一标识,避免同一资源产生多个地址。第二,地址仅用于内部跳转时,可以接受宽松集合,但应在跳转前完成一次存在性判定,防止无效地址进入公开链接。
落地时按以下顺序执行:先确认地址是否需要唯一解析;再选择规则约束或运行时判定;然后部署一种判定方式并保留拒绝记录或不存在记录;最后用记录与生成端样本对照,决定是补充模式、修复生成端,还是调整判定位置。每一步的结果都会决定下一步的方向,而不是一次性把集合定义完。