DEBUG.WIKI
V.PS:让项目靠近用户,亚太、欧洲、北美 KVM VPS
IPPeak:从目标地区访问网页,住宅代理、SEO 监测、广告验证
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国

curl 配置 HTTP_PROXY 后仍直连超时:HTTP 代理变量要小写

显式代理可用,HTTP_PROXY 环境设置却无效时,核对小写 http_proxy、进程继承及 NO_PROXY 等覆盖规则。

curl 显式使用 --proxy 可以下载,但只设置 HTTP_PROXY 后,请求 HTTP 地址仍然超时。先检查变量大小写:curl 对 HTTP 代理只接受小写 http_proxy,这一点与 HTTPS_PROXY 等变量不同。

这里讨论 curl 命令行读取进程环境中的代理配置。终端能看到变量,也不等于运行 curl 的进程获得了它;服务、cron 和其他 shell 启动的命令还要核对实际环境。

用小写变量做一次有明确范围的请求

下面采用 Bash 风格的命令前缀,只为这一条请求指定 HTTP 代理。代理地址、端口和目标 URL 都是示例,必须替换成获准使用的地址:

http_proxy='http://proxy.example.com:3128' \
  curl --output package.bin 'http://download.example.com/package.bin'

这个设置不会写入 shell 启动文件,也不会改变其他终端的配置。若需要让后续进程继承变量,Bash、sh 一类 shell 使用 export http_proxy=...;tcsh 使用 setenv http_proxy ...,不要混用语法。

例如,tcsh 的设置结构是:

setenv http_proxy http://proxy.example.com:3128

curl 有意忽略大写 HTTP_PROXY,因为 CGI 环境可能从入站 HTTP 请求头生成同名变量。无需通过升级系统或放宽安全设置改变这个规则。

目标协议与代理协议是两件事

目标 URL 是 http:// 时检查 http_proxy;目标是 https:// 时检查 https_proxy 或 HTTPS_PROXY。其他受支持的代理环境变量通常也接受大写形式,不能把 HTTP 的特殊规则推广为“curl 所有代理变量都必须小写”。

变量名中的 https 表示目标请求协议,不要求代理 URL 一定写 https://。只提供普通 HTTP 代理的端口仍应写 http://代理地址:端口,HTTPS 目标可以通过 CONNECT 建立隧道。是否存在到代理的 TLS 连接,取决于代理本身提供的协议。

小写已经正确,为什么仍没有走代理

继续检查 NO_PROXY 或 no_proxy 是否匹配目标主机,以及命令中有没有 --noproxy。也要检查实际使用的 .curlrc 与显式 --proxy 参数,它们可能改变这条请求的代理选择。

只有 ALL_PROXY 不代表所有请求都会用它:特定协议的代理变量存在时会优先采用对应变量。排查时一次只调整明确的目标范围,记录原值,不要无差别清除整台机器的代理配置。

如果变量已选中但连接失败,转向代理地址、端口、认证或目标访问限制;不能把代理返回的错误理解为 curl 忽略了变量。需要查看详细连接信息时,使用无敏感凭据的请求,避免把代理密码、Authorization 或下载令牌放进共享日志。

成功标准是请求通过指定代理获得预期内容,连接信息与代理端的记录一致,并且没有改动不相关服务的网络路径。结束单次排查后,恢复原代理设置;命令前缀形式则在该进程结束时自动失效。