先给结论:当源站返回的301转向正常、但经过CDN或边缘节点后异常时,你应保留三组证据——源站直连响应、边缘节点响应、以及两者之间的请求标识与时间戳。这些证据要能证明“异常发生在边缘层而非源站”,否则后续无论是找CDN厂商还是改配置,都没有可对照的基准。缺少完整日志权限时,最小动作是用带唯一查询参数的URL分别请求源站和边缘,记录状态码、Location头和响应时间,但不能据此断定是缓存、回源还是节点软件的问题。
301转向的处理链路上,源站和边缘节点是两次独立的状态码生成过程。源站可能正确返回301与Location,而边缘节点因为缓存了旧的跳转规则、回源路径配置错误、或对Location做了改写,最终给用户的响应与源站不一致。
判断异常归属,关键不是看“谁对”,而是看两者响应是否一致。若源站直连返回301 → https://example.com/new,边缘返回302 → https://example.com/old,差异本身就说明问题出在边缘侧的处理环节,而不是源站的重定向逻辑。此时若只保留边缘截图,就失去了对照物。
按优先级,建议保留以下内容。假设你只有一个浏览器和curl,没有CDN后台日志权限,仍可完成前两项。
curl -I请求源站IP或回源域名,记录完整响应头,重点是状态码、Location、Cache-Control、Age(若存在)和Date。?probe=20240601a),分别请求源站和边缘,记录响应头中的X-Cache、X-Request-ID、Via、CF-Cache-Status等厂商相关字段(若存在)。这些字段能帮助判断请求是否命中缓存、经过了哪些节点。动作的结果直接影响下一步:如果边缘响应头里出现Age大于0且Location是旧值,优先怀疑缓存了旧的301;如果Location被改写成相对路径或丢失协议,则问题更可能在边缘的重写规则,而不是缓存。
不是所有字段不一致都指向异常。以下差异有诊断价值:
Location目标不同,或协议/域名被改写。Age或缓存命中标识,且Location为旧值。而Date、Server、X-Powered-By等字段的差异通常只是节点软件或时间不同,不能单独作为301异常的判断依据。把噪声当证据,会让排查方向跑偏。
没有CDN后台日志和源站访问日志时,你仍可执行上述curl对照,并把两次响应头保存为文本文件,附上采集时间与执行命令。这是可复查的最小证据集。
但要注意边界:
Location,不能直接推出“源站没更新”。源站直连正常已经排除了这一点,但也不能推出“一定是缓存”,还可能是边缘配置未同步。一个假设的例子:你发现边缘A节点返回旧跳转、边缘B节点正常。保留两个节点的响应头和请求时间后,你可以向CDN支持说明“同一URL在不同节点结果不一致”,而不是笼统地说“301坏了”。这会让对方更快定位到配置同步或缓存分发环节。若无法区分节点,至少保留多次请求的时间序列,用出现频率描述异常,而不是用单次结果下结论。
拿到三组证据后,按以下顺序推进,每一步的结果决定下一步:
Location。若目标不同,先检查边缘的重定向规则和回源改写配置,而不是改源站。Location相同但状态码不同,检查边缘是否把301改写成了302或直接返回200。这通常与边缘的“跟随重定向”或缓存策略有关。整个过程中,保留原始响应文本比截图更有用,因为文本可以搜索、对比和附在工单里。每次改动配置前,先保存一份当前响应作为基线,这样改动后能判断变化是否来自你的操作,而不是节点自身的波动。