Clash 拉取订阅时若得到 HTTP 401,说明这次请求已经到达服务器并完成了 HTTP 交互,但服务器认为客户端尚未通过身份认证。MDN 写明:标准用词虽是 Unauthorized,语义上表示 unauthenticated,客户端必须先认证才能拿到所请求的响应。因此应先核对该次请求有没有带上有效凭据,而不是先换网络或重装客户端。
适用条件
只在已经看到明确状态码 401 时使用。没有任何状态码(解析失败、连接重置、握手中断)时,不能按凭据问题处理。若实际是 403,MDN 说明客户端身份已被服务器知道,只是没有访问权,与「尚未认证」不同。若是 407,需要认证的是代理。若是 511,需要的是接入网络的认证。这三类都不要当成订阅凭据本身填错。
核对步骤与判断依据
- 先记下完整状态码,确认是 4xx 里的 401,而不是 400(请求语法、分帧或路由被当成客户端错误)、404(找不到资源)、429(短时间内请求过多)或 5xx。
- 按「必须认证才能拿到响应」检查订阅 URL 或请求中是否包含令牌、用户名、密码等凭据,以及客户端发出的请求是否仍携带同一套值。复制时丢掉查询参数、截断密钥、使用过期令牌,服务器都会按未认证处理。
- 判断依据:更正凭据后若变为 2xx(例如 200 表示请求成功),说明原先就是认证缺失或错误。若变为 403,身份已被识别但没有权限,应改查授权关系。若变为 404 或 410,资源不存在或已永久删除,不是凭据格式问题。
- 遇到 301、302、307、308 时,不要把第一跳状态和最终取正文的状态混在一起,以最终那一次是否仍为 401 为准。
失败时下一步
凭据看起来完整仍返回 401,先排除途中 407 与网络准入 511。仍无法判断时,只保存状态码和脱敏后的 URL 形态(去掉密钥),向订阅提供者确认该资源要求何种认证。在看到 2xx 之前,不要假定订阅内容已更新成功。
资料来源: https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status