元数据
| id | proxy-env-var | 收录 | 2026-09-01 |
|---|---|---|---|
| 问题域 | 编码代理与终端 | 主题分组 | 网络与镜像 |
| 适用工具 | curl · 外部工具 | ||
症状
设了代理环境变量但表现不一致的典型形态:
- `curl` 仍然直连超时/失败,而 `pip install` 却能走通——同一个变量,有的命令听、有的不听;
- 只 `export HTTP_PROXY=...`(大写)时 `curl` 完全无视,`git`/`pip` 却生效;
- 设了代理后 `localhost`、`127.0.0.1`、内网请求反而失败——被代理截走(NO_PROXY 缺失);
- 容器/服务里设了变量却依旧直连——环境变量没被传进容器。
同族但别在本页死磕:报错明确指向「代理服务器拒绝连接」时,先确认代理软件本身在监听(`ss -ltn`),再回来看变量大小写。
原因
不同工具对代理环境变量的「大小写敏感度」不一样:**curl 故意忽略大写 `HTTP_PROXY`**(CGI 环境下大写变量可能被外部注入的安全设计,`HTTPS_PROXY` 是唯一特批生效的大写),只认小写 `http_proxy`/`https_proxy`;`pip`/`git` 认大写(也认小写);`npm` 以 `npm config get proxy` 配置优先。所以「只设一个大写 HTTP_PROXY」时,curl 直连、pip 走代理——「有的走有的不走」是设计使然,不是配置写错。第二个坑是 `NO_PROXY` 缺失:本地/内网请求被塞进代理导致失败。
解法
1. **四件套全设 + NO_PROXY**(一键命令见「快速修复」):小写+大写四个变量都 export,并配 `NO_PROXY=localhost,127.0.0.1,.local`——覆盖所有工具的大小写偏好,一劳永逸。
2. **逐工具反向验证**(见「快速修复」):临时指向死端口,报错 = 变量被读;不报错 = 这个工具不认这个写法。
3. **git 单独查**:`git config --global --get http.proxy`——git 除了环境变量还认 `http.proxy` 配置,两者都有时配置优先。
4. **容器/服务显式传**:Docker 默认不继承宿主变量,`docker run -e` 或 compose `environment:` 补上。
5. **系统代理模式不冲突**:Clash/V2Ray 的「系统代理」不写 shell 变量,`env | grep proxy` 为空属正常,不用重复设。
验证证据
- 2026-09-01 本机实测(WSL Ubuntu 26.04,curl 8.18 / pip 25.1):`实测复现日志(2026-09-01)`
- 基线直连 127.0.0.1:8089 → 200;大写 `HTTP_PROXY=死端口` 下 curl 仍 200(忽略大写,实锤);
- 小写 `http_proxy=死端口` → curl 000(小写生效,实锤);
- `HTTPS_PROXY=死端口` + https 目标 → 000(HTTPS_PROXY 大写生效,实锤);
- `http_proxy=死端口 + NO_PROXY=127.0.0.1` → 200(NO_PROXY 绕过,实锤);
- pip 在大写 HTTP_PROXY=死端口下报 `Could not find a version`(pip 认大写,实锤);加 `NO_PROXY=pypi.org` 后下载成功。
来源与证据
素材来源:本站实测沉淀(2026-09-01)
验证证据:Evidence details kept locally (2026-09-01)