Clash 拉取订阅在协议上就是一次 HTTP 请求。地址发生跳转时,不能把“浏览器最后打开了某个页面”或“客户端显示已请求”当成最终来源已经核对完毕。MDN 将响应分成五类:100–199 信息、200–299 成功、300–399 重定向、400–499 客户端错误、500–599 服务器错误。核对最终来源,就是按这一分类读完每一跳的状态码以及响应里给出的新 URL,而不是只看是否还能继续访问。
适用条件与资料边界
本文只依据 HTTP 响应状态码说明,适用于订阅 URL 返回 3xx、或导入结果的主机与你保存的地址不一致、需要判断配置究竟从哪一个 URI 取出的场景。所列状态码由 RFC 9110 定义;若收到未列入的码,属于可能随服务器软件定制的非标准响应,不能按标准重定向解释。本页不描述任何图形客户端的菜单路径,判断应落在请求方法、状态码类别和重定向响应中的新 URL。
先分清永久迁址、临时改址与改方法
对每一跳同时记下原始 URI、状态码和响应给出的新 URL:
- 301:请求资源的 URL 已永久改变,新 URL 在响应中给出。长期来源应改为该新 URL。
- 308:资源永久位于 Location 头给出的另一 URI,语义同 301,但用户代理不得改变 HTTP 方法;先前若是 POST,重定向后仍必须是 POST。订阅多用 GET,方法通常不变,仍以 Location 中的 URI 为永久来源。
- 302:URI 只是临时改变,将来还可能再变,今后请求应继续使用原来的 URI。此时内容可能从另一主机取出,但可长期记录的订阅地址仍应是原始 URI。
- 307:同样是临时改 URI,且必须保持原方法。它与 302 的差别是方法是否允许被改掉,不是“能不能把落点存成新订阅”。
- 303:服务器要求改用 GET 到另一 URI 取资源。若该 URI 是登录页或说明页,随后即使出现 200,取出的也往往不是配置正文。
- 300:存在多种可能响应,没有标准化的自动选择方式,客户端自行选定的“最终来源”缺乏标准依据。
- 304:用于缓存,表示可继续使用已缓存的同一份响应,并不提供新的来源 URI。
305 已因安全顾虑弃用,306 已不再使用。这两类码不能当成正规迁址。
确认真正取出资源的那一跳
成功类里,GET 得到 200 才表示资源已获取并在消息体中传输。3xx 只负责给出下一步 URI,即使带有消息体,也不等于那就是订阅内容。203 表示返回的元数据与源服务器不完全相同,可能来自本地或第三方副本,记录时应标明非权威。204 没有消息体,只有头有用,不能当作配置已到手。
建议按跳记录:序号、状态码是否属于 300–399、主机是否变化、方法是否被要求保持或改为 GET。完整订阅地址可只留本地;对外说明用主机名加状态码序列即可。若 3xx 在若干主机间循环,应停止跟随。508 表示处理请求时检测到无限循环,可作跳转链异常的对照;即便未出现该码,无终止的 3xx 链也不能视为已核对来源。
核对失败时的下一步
最终落到 401,语义是未认证,必须先认证才能得到所请求的响应,跳转目标不是配置来源。403 表示身份已知但无权限,与 401 不同。404 找不到资源;410 表示永久删除且无转发地址,客户端应清除缓存和链接。502、504 是网关失败,503 为暂时不可用,后者在可能时应查看 Retry-After,它们都不是新的订阅来源。未列入的状态码按非标准响应处理,不要写入“已永久迁址”。仅当 301 或 308 给出新 URI 时,才把可信来源改为该 URI;302 与 307 应继续以原 URI 为记录中的地址。
https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status