先不要急着改规则,而是把“正常页”和“异常页”之间的差异逐项固定下来:请求路径、查询参数、参数顺序、参数数量、大小写、末尾斜杠、请求方法、协议与主机名、请求头里的Accept或User-Agent。多数情况下,异常只由其中一两个变量触发,缩小到最小可复现请求后,才能判断该保留规则、改写规则还是退出这条跳转。
带参数的跳转异常,常见表现是:不带参数访问旧地址时跳到新地址,带上某些参数后却停在旧地址、跳到错误页面,或者参数被丢掉。要缩小范围,第一步是让两次请求只差一个变量。
如果只改参数顺序就出现不同结果,说明规则很可能在匹配完整查询串,而不是匹配路径。此时下一步不是加更多例外,而是确认匹配条件应该基于路径还是基于查询串。
缩小复现条件时,可以把异常归到三层,每层的证据不同。
规则里写了精确匹配、前缀匹配还是正则匹配,决定了带参数请求会不会被命中。若规则以旧路径加问号为条件,参数一变就可能漏匹配。可验证动作:把同一路径下带参数与不带参数的请求分别记录,比较命中的规则编号或日志行。若只有带参数的请求没有命中记录,问题在匹配层。
跳转目标里是否保留查询串,取决于规则写法。有的配置默认丢弃原查询串,有的会追加。可验证动作:构造一个只含单个参数的请求,检查跳转后Location是否带该参数。若单参数能保留、多参数丢失,通常是拼接逻辑对&或编码处理不一致。
跳转由边缘规则完成,还是由源站应用返回,会影响参数行为。可验证动作:绕过边缘直接请求源站同一路径,比较返回的状态码与Location。若源站本身就对带参数请求返回200而不是301,则异常不在跳转规则,而在应用路由。
保留适用于参数对目标页有实际意义,且目标页能正确解析这些参数。前提是参数名和目标页约定一致,且不会因为保留而暴露内部参数。动作:在跳转目标后显式拼接原查询串,再用单参数、多参数、空值各测一次。若目标页对空值参数报错,就不能无条件保留。
改写适用于参数需要映射,例如旧参数名要换成新参数名,或需要丢弃跟踪参数。前提是你能列出需要改写的完整参数清单,并接受未列出的参数被丢弃。动作:先只改写一个参数,确认目标页读取正确后再扩展。若改写后目标页仍依赖旧参数名,则应回到保留方案。
退出适用于参数本身没有业务含义,或目标页无法处理这些参数。退出不是简单删掉规则,而是让带参数的旧地址不再进入这条跳转,改由其他规则或源站处理。前提是你已确认这些参数不会带来有效流量,且退出后不会产生循环跳转。动作:先对一小部分参数模式停用规则,观察这些请求的落点是否可接受,再决定是否扩大范围。
三种取舍不能同时套用在同一组参数上。判断依据是:参数是否影响目标页内容、目标页是否能安全解析、以及保留参数是否会造成重复内容或循环。若这三点都不明确,优先做最小改写并保留可回退的配置记录。
假设旧地址 /old?utm_source=a&id=1 正常跳转到 /new,而 /old?id=1&utm_source=a 停在旧页。先固定路径与参数集合,只交换顺序,异常复现,说明规则匹配了整个查询串。再把 utm_source 去掉,只留 id=1,跳转正常,说明跟踪参数参与匹配是关键变量。此时可把规则从匹配完整查询串改为匹配路径前缀,并显式决定是否保留查询串。改完后重测四种组合:无参数、单参数、多参数、参数顺序颠倒。若四种都落到同一目标,说明复现条件已收敛;若仍有一种异常,继续固定该组合中的下一个变量,而不是一次性重写全部规则。
参数异常修复后,某个参数组合的请求量下降,可能来自规则生效,也可能来自缓存、客户端不再发送该参数、或监控口径变化。要区分这些解释,需要同时看跳转目标、状态码和请求是否仍到达源站。robots.txt 的抓取限制不等于可靠的索引移除,站点地图也不保证收录,这两点与参数跳转无直接关系,但同样说明“看不到请求”不能单独证明处理正确。真正可复现的证据是:同一组最小请求在修改前后返回了不同的状态码或Location,并且这个差异能被重复观察到。