linux下http代理不是“设一次就全局生效”,而是按工具分层生效:curl认http_proxy环境变量,git优先读自身http.proxy配置,apt完全不认环境变量而只认/etc/apt/apt.conf.d/中的acquire::http::proxy。

http_proxy 和 https_proxy 不是“设了就全局生效”的开关,而是按工具分层认的——curl 读它,git 优先用自己的配置,apt 根本不看它。
export http_proxy= 为什么没生效?
最常踩的坑是语法和范围错位:
-
http_proxy必须全小写;HTTP_PROXY在curl里能 fallback,但git、wget、apt只认小写 - 等号
=两边不能有空格:export http_proxy=http://10.0.0.1:8080✅,export http_proxy = http://10.0.0.1:8080❌ - 值必须带
http://前缀,哪怕代理本身是 HTTPS ——https_proxy才走 TLS 隧道,http_proxy只告诉客户端“往这发 CONNECT 请求” - 没加
export就只是 shell 内部变量,子进程(比如你运行的curl)根本看不到
no_proxy 为什么 localhost 还走代理?
no_proxy 是后缀匹配,不是通配符,且必须显式列出本地地址:
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
- ✅
export no_proxy="localhost,127.0.0.1,::1,.example.com"——.example.com匹配api.example.com和www.example.com - ❌
export no_proxy="*.example.com"—— 大多数工具直接忽略 - ❌
export no_proxy="192.168.*.*"—— 不生效;只有curl支持 CIDR(如192.168.0.0/16),git不支持 - 务必包含
localhost、127.0.0.1、::1,否则curl http://localhost:3000可能被转发到代理,本地开发直接失败
apt / yum / dnf 为什么 ignore http_proxy?
它们根本不读环境变量,只认自己配置文件里的硬编码键名:
-
apt:写入/etc/apt/apt.conf.d/80proxy,内容为Acquire::http::Proxy "http://10.0.0.1:8080";(末尾分号不能丢) -
yum(RHEL/CentOS 7):追加proxy=http://10.0.0.1:8080到/etc/yum.conf;https_proxy对它无效 -
dnf(RHEL/CentOS 8+):同yum,但可加proxy_ssl_verify=0(慎用) - 验证是否真走代理:
sudo apt update -o Debug::Acquire::http=true 2>&1 | grep "Connecting to",看到连接目标 IP 才算生效
Git clone 超时却没走代理?
git 默认不读 http_proxy 环境变量,它有自己的配置层级:
- 强制走代理:
git config --global http.proxy http://10.0.0.1:8080 - 取消代理:
git config --global --unset http.proxy - 临时覆盖:
git -c http.proxy=http://10.0.0.1:8080 clone https://github.com/user/repo - 如果代理需认证,URL 中密码含
@或/,必须先 URL 编码,比如ab@c/d→ab%40c%2Fd
http_proxy 值,在 curl 里生效,在 git 里静默失效,在 apt 里完全被无视——得一个个对齐工具的预期。










