为什么 curl 忽略 HTTP_PROXY
了解 curl 对 HTTP_PROXY 的刻意例外、协议专用变量与 ALL_PROXY,以及如何让基于环境变量的代理测试更可预测。
访问 HTTP 目标时,请设置小写的 http_proxy。curl 会刻意忽略大写的 HTTP_PROXY。在 POSIX shell 中:
http_proxy=http://127.0.0.1:8080 curl http://example.com/
https_proxy=http://127.0.0.1:8080 curl https://example.com/这些赋值只对紧随其后的命令生效。将示例监听地址替换为你的代理;若要比较公共代理端点,可从 HTTP 代理列表中选择一个候选。https_proxy 变量为 HTTPS 目标选择路由;值为 http:// 时,仍表示可以为目标建立隧道的普通 HTTP 代理。PowerShell 和 Windows 命令 shell 使用不同的赋值语法。
为什么这一大写写法存在风险
CGI 环境可能将传入的请求头转换为大写的 HTTP_ 变量。因此,名为 Proxy 的请求头可能变成 HTTP_PROXY。若将它作为出站配置来信任,请求数据就能决定使用哪个代理。curl 要求小写,避开了这种映射;HTTPS 和其他协议变量并非完全采用相同的例外规则。
修改变量后路由仍未改变时
先查找协议专用变量,再检查作为后备的 ALL_PROXY。匹配的 NO_PROXY 规则可以绕过代理。小写变体以及相互竞争的定义也会产生影响。下面这个类 Unix shell 循环只报告变量是否存在,不打印可能含凭据的值:
for name in http_proxy HTTP_PROXY https_proxy HTTPS_PROXY all_proxy ALL_PROXY no_proxy NO_PROXY; do
if printenv "$name" >/dev/null; then
printf '%s is set\n' "$name"
fi
done在本地检查列出的定义。若某个定义重新出现,检查启动它的 shell、服务、IDE、容器或 CI 配置。变量存在只能指出可能的输入,不能说明最终采用了哪个值。
要将一次请求与这些代理选择隔离,请同时指定端点和空的绕过列表:
curl --proxy http://127.0.0.1:8080 --noproxy '' --connect-timeout 5 --max-time 15 --verbose https://example.com/如果允许直连,可这样进行比较:
curl --noproxy '*' --connect-timeout 5 --max-time 15 --verbose https://example.com/这些命令有助于区分继承的路由与连接故障。进一步修改环境设置前,请逐阶段解读代理测试结果。curl 的变量规则适用于 curl;应用自身的运行时可能以不同方式发现和合并代理配置。