proxy settings mismatch:环境变量与系统代理指向不同的地址
proxy environment variables disagree with system proxy严重程度 Medium环境代理变量与系统代理指向了不同的地址。读环境变量的应用(多为命令行工具)与读系统代理的应用(多为浏览器)会走上不同的路径,造成'有的能用有的不能';第一步是以代理客户端当前实际监听的端口为准,把两处统一。
结论
一台电脑上其实并存着两套互不相干的代理配置:操作系统的系统代理设置,和 shell 的环境变量。它们由不同的机制维护,被不同的应用读取,谁也不会通知谁。
当两者指向不同的地址时,你会遇到一种特别费解的症状:浏览器一切正常,某个命令行工具却连不上——或者反过来。两个应用都"按配置工作",只是它们读的是不同的配置。
适用环境
- Windows / macOS / Linux 桌面系统
- 同时使用图形界面应用与命令行工具的环境
一分钟快速判断
connproof doctor看"代理配置一致性"一项:
代理配置一致性:环境变量指向 127.0.0.1:7890,系统代理指向 127.0.0.1:7891(对应 PROXY-004)
两个端口不同即命中本页。若只配置了其中一处,工具会报 pass 并说明"不存在冲突"——只有一处配置不是问题,两处打架才是。
这条错误代表什么
回到机制层面理解为什么会有两套配置:
系统代理是操作系统提供的一个约定位置(Windows 的 Internet Settings、macOS 的网络服务代理设置)。启用它时,代理客户端把自己的监听地址写进去。但它只是一个建议——没有任何机制强制应用去读。
环境变量(HTTP_PROXY、HTTPS_PROXY、ALL_PROXY)是 Unix 世界的传统做法,由 shell 会话或配置文件设置。命令行工具、包管理器、开发工具普遍只认这一套,完全不看系统代理。
两套机制的分工大致是:浏览器与多数图形界面应用读系统代理;命令行工具读环境变量;还有一批应用有自己的独立设置,两个都不读。这也是浏览器能用但应用不能的根源之一——本页描述的是其中最隐蔽的一种:两处都配了,但配得不一样。
怎么会变成不一致的
最常见的路径是端口漂移:代理客户端升级或改配置后换了监听端口,它自动更新了系统代理(因为那是它管理的),但环境变量是你当初手工写进 shell 配置文件的,它不知道、也改不了。于是系统代理跟上了新端口,环境变量还停留在旧端口。
其他成因:
- 曾为临时需要手工
export过代理变量并写进了配置文件,后来遗忘; - 先后使用过两个代理软件,一个设过环境变量、另一个设了系统代理;
- 脚本或开发工具在会话中临时设置了变量且未清理。
ConnProof 如何判断
判定需要把两处配置归一化到可比较的形式,因为它们的格式不同:环境变量是完整 URL(http://127.0.0.1:7890),系统代理常是裸的 host:port,Windows 还可能是多协议写法(http=127.0.0.1:7890;https=...)。
检测器统一提取出 host:port,并处理三种等价情况:去掉协议前缀与路径、取多协议写法的第一项、把 localhost 与 127.0.0.1 视为同一地址(否则会产生大量误报)。嵌入在 URL 里的凭据会在比较前被剥离,不会进入报告。
归一化之后两者仍不同,才判为 PROXY-004,状态 warning——因为这不必然是故障(你可能就是故意让两类应用走不同代理),但它足够反常,值得你确认一次是不是有意为之。
排查步骤
第一步:确定正确的端口。 打开代理客户端的设置页,看它当前实际监听的端口。这是唯一的事实来源——不要凭记忆,也不要以任何一处配置为准。用检测确认它确实在监听:
connproof tcp 127.0.0.1 --port 客户端实际端口第二步:统一两处配置。
Windows:系统代理在 设置 → 网络和 Internet → 代理;环境变量在 系统属性 → 环境变量,检查用户变量与系统变量两栏。
macOS / Linux:系统代理在网络设置里(macOS 需按网络服务逐个检查);环境变量看 shell 配置文件(~/.zshrc、~/.bashrc、~/.profile),搜索 proxy 关键词。
第三步:清理残留。 改完之后开一个新终端验证——旧终端的会话里还留着老变量,在那里测会得到误导性的结果。
一个决策建议
统一之外,还有一个更省心的选择:只保留一处。
如果你的命令行使用不多,可以把环境变量彻底删掉,只用系统代理,需要时临时 export;反过来,如果你主要在终端工作,也可以关掉系统代理只用变量。配置点越少,未来出错的地方就越少——这条错误的根源就是"两处配置需要人工同步",而人工同步迟早会漏。
如何区分本地问题和服务端问题
这条错误完全在本机,与服务端无关。需要区分的是它与近亲的边界:
| 证据 | 结论 |
|---|---|
| 两处指向不同端口 | 本页(PROXY-004) |
| 只有一处配置 | 不是本页;某些应用不走代理属正常,见 CLIENT-003 |
| 两处一致但端口无监听 | 转 PROXY-003 |
| 系统代理指向空端口且客户端已退出 | 转 PROXY-002 |
仍未解决时收集什么信息
- ConnProof 错误码(PROXY-004)与 doctor 脱敏输出;
- 代理客户端设置页显示的实际监听端口;
- 两处配置各自的端口值;
- 操作系统版本与所用 shell。
禁止提交:完整订阅链接、密码、验证码、私钥、Token。代理变量中若含凭据,报告已自动剥离。
重新运行检测
connproof doctor统一之后"代理配置一致性"应显示 pass。
相关文档
更新记录
- 2026-07-29:规则 v1 发布,doctor 新增"代理配置一致性"检查项。