把 Clash 订阅备份成文件前,必须确认这次响应不是登录页或其它给人看的页面。登录过程在 HTTP 上经常表现为:直接给出 401,或先 302、303 再对登录 URI 返回 200。MDN 指出 200 对 GET 只表示取出并传输了资源,该资源可以是登录文档。511 表示客户端需要认证才能接入网络,门户页也常被误存。备份应以状态码和跳转目标为准,而不是「有文件就留一份」。
适用条件
适用于定期保存订阅、从更新结果导出文件、或把响应复制到备份目录的场景,也适用于曾经把网页放进配置目录、需要建立排除规则的情况。本次请求没有状态码时不备份。1xx 中间响应同样不产生可保存的配置。
操作步骤与判断依据
- 先看最终状态码是否属于成功类。401 的语义是尚未通过认证,受保护资源不会交给当前客户端,认证提示页不得作为配置备份。403 是身份已知但服务器拒绝给出资源,同样不要备份。407 要求代理侧认证,511 要求先通过网络准入,二者带来的页面都不是订阅配置。
- 拒绝保存明显的网页型错误响应。404 表示找不到资源,是网上最广为人知的页面响应之一。410 表示永久删除且无转发地址,规范期望客户端去掉缓存和链接,更不应新建备份。503 用于维护或过载,并提到应发送说明问题的页面,该说明页不得写入配置备份。500、502、504 属于服务器或网关错误,正文若存在也不是有效配置。
- 处理 200 与重定向。若链路中有 301、302、303、307、308,备份对象必须是原订阅 URI 上的配置,不是跳转后的文档。303 会引导用 GET 取另一 URI,最容易落到登录页却仍显示 200。204 无正文,没有可备份内容。206 只有部分内容,不能当完整备份。304 表示沿用缓存,若缓存来源不明,不要据此新写一份「最新备份」。
- 允许写入备份的 HTTP 前提是:方法为 GET、最终为 200、没有落入上述登录或说明 URI、也不是 204 或 206。即便如此,仍需在应用层确认正文是订阅资源而非页面。确认过程不要把正文发到外部。
失败时下一步
无法区分 200 正文是页面还是配置时,跳过本次备份,保留上一份已验证文件。旧文件若来自 404 或 503 页面,应停止继续引用,并改向提供者核对 URI。反复出现指向同一登录 URI 的 302 或 303,先完成认证再谈备份。出现未列出的状态码,不要因为「有下载结果」就存盘。
资料来源: https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status