Problem entry · machine-readable · 编码代理与终端

设置了代理环境变量却不生效——有的命令走代理有的不走(HTTP_PROXY 大小写坑)

本页嵌入 #trove-entity JSON(本条目全量结构化数据);全库数据见 /agent/trove.json。

元数据

idproxy-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)