cURL 设置代理最常用的写法,是用 -x 指定代理地址,用 -U 单独填写代理账号和密码。例如,通过带账密认证的 HTTP 代理访问 HTTPS 网站:

curl -x http://proxy.example.com:7778 \
  -U 'username:password' \
  https://example.com/

代理协议由 -x 后面的地址决定,最后的 https://example.com/ 是目标 URL。两者不是同一个概念。下面先用一张表选择正确写法。

使用需求 代理地址写法 关键区别
HTTP 代理 http://host:port 客户端到代理使用 HTTP
HTTPS 代理 https://host:port 客户端到代理这一段使用 TLS
SOCKS5,本机解析目标域名 socks5://host:port DNS 查询由运行 cURL 的机器完成
SOCKS5,代理解析目标域名 socks5h://host:port 目标主机名交给 SOCKS5 代理解析

如果还不确定业务应该使用哪一种代理,可先了解 HTTP、HTTPS 与 SOCKS5 的区别和适用场景。本文只讲 cURL 中如何配置、验证和排错,不重复展开代理协议原理。

下文多行命令按 Bash/zsh 格式展示;Windows PowerShell 可合并为一行,并优先使用 curl.exe 避免系统别名影响。

一、cURL 的代理参数怎么写?

-x--proxy 的短写,用来指定代理协议、Host 和 Port;-U--proxy-user 的短写,用来提供代理用户名和密码。cURL 的完整结构可以拆成:

curl -x [代理协议://代理Host:代理Port] \
  -U '[代理用户名:代理密码]' \
  [目标URL]
命令部分 控制什么 常见错误
-x / --proxy 客户端连接哪个代理、使用什么代理协议 把目标网站地址误填成代理地址
-U / --proxy-user 向代理服务器提交认证凭证 误用 -u,把凭证发给目标站
目标 URL 代理建立后真正访问的资源 根据目标 URL 的 HTTPS 误判代理本身也是 HTTPS

cURL 官方手册说明,代理地址未写协议前缀时默认按 HTTP 代理处理。为了减少歧义,实际配置时建议始终写出 http://https://socks5://socks5h://

二、cURL 怎么设置 HTTP / HTTPS 代理?

1. HTTP 代理基本写法

curl -x http://proxy.example.com:7778 \
  https://example.com/

如果代理使用纯 IP 白名单认证,并且当前公网来源已进入白名单,通常不需要再填写 -U;具体仍以服务商的认证规则为准。

2. HTTP 代理带用户名密码

curl -x http://proxy.example.com:7778 \
  -U 'username:password' \
  https://example.com/

这时 username:password 用于代理认证,不是目标网站的登录账号。测试命令中不要放真实生产凭证,也不要把带认证信息的终端截图直接发到公开工单。

3. HTTP 代理访问 HTTPS 网站是什么意思?

curl -x http://proxy.example.com:7778 \
  https://example.com/

这条命令仍然使用 HTTP 代理http://proxy.example.com 决定客户端如何连接代理;https://example.com 决定目标网站使用 HTTPS。对于 HTTPS 目标,HTTP 代理通常通过 CONNECT 建立隧道,但这不会把“客户端到普通 HTTP 代理”自动变成 HTTPS 代理连接。需要进一步理解这条边界时,可查看 HTTP 代理访问 HTTPS 网站的工作方式

4. 真正的 HTTPS Proxy 怎么写?

只有服务商明确提供支持 TLS 的 HTTPS Proxy 端点时,代理地址才应写成 https://服务商所说的“支持访问 HTTPS 网站”,并不等于代理端点本身就是 HTTPS Proxy。

curl -x https://proxy.example.com:7778 \
  -U 'username:password' \
  https://example.com/

这里代理地址本身以 https:// 开头,cURL 到代理服务器这一段使用 TLS。使用 HTTPS 代理时,cURL 会验证代理证书中的主机名和签发链;内部 CA 或自签证书环境应正确配置代理 CA,例如使用 --proxy-cacert,而不是把 --proxy-insecure 当成长期解决方案。相关选项可参考 cURL 的 HTTPS Proxy 说明。如果 https:// 代理直接提示协议不支持,可先执行 curl -V 查看当前 cURL 版本和 TLS 后端;HTTPS Proxy 是否可用与当前构建有关。

三、cURL 怎么设置 SOCKS5 代理?

1. SOCKS5 基本写法

curl -x socks5://proxy.example.com:1080 \
  https://example.com/

2. SOCKS5 用户名密码认证

curl -x socks5://proxy.example.com:1080 \
  -U 'username:password' \
  https://example.com/

SOCKS5 有自己的认证流程,不使用 HTTP 的 407、Proxy-AuthenticateProxy-Authorization 机制。遇到 SOCKS5 认证失败时,应检查端点、账号密码和客户端支持情况,不要把所有认证错误都按 HTTP 407 处理。

3. --socks5 写法

curl --socks5 proxy.example.com:1080 \
  https://example.com/

--socks5 host:port-x socks5://host:port 都表示使用 SOCKS5,并由本机解析目标域名。为了让不同协议的命令形式保持一致,本文后续主要使用 -x 写法。

四、socks5://socks5h:// 有什么区别?

两者的区别只在目标域名由谁解析。代理服务器自身的域名 proxy.example.com 仍要由本机找到;变化的是目标域名 example.com 的解析位置。

# 目标域名由本机解析
curl -x socks5://proxy.example.com:1080 \
  https://example.com/

# 目标域名交给 SOCKS5 代理解析
curl -x socks5h://proxy.example.com:1080 \
  https://example.com/
写法 目标域名解析位置 适合情况
socks5:// 本机 DNS 本地可以正确解析目标域名,并希望沿用本地解析结果
socks5h:// SOCKS5 代理 需要由代理所在网络解析目标域名,或本地无法得到合适结果

cURL 官方参数说明socks5h:// 视为 --socks5-hostname 的等价写法。选择时只需围绕DNS解析位置,不必把这一小节扩展成所有DNS或浏览器泄漏问题。

cURL使用socks5和socks5h时目标域名解析位置对比图
socks5:// 由本机解析目标域名,socks5h:// 把目标域名交给代理解析。

五、cURL 代理账号密码怎么填写?

1. 推荐使用 -U

推荐通过 -U 'username:password' 单独提供代理凭证,而不是把账号密码嵌入代理 URL。这样阅读和排错更清楚。命令行凭证仍可能短暂出现在进程列表或保留在 Shell 历史中;生产环境应使用受控配置文件或密钥管理方式,不要长期把密码明文写进脚本。

-U-u 不一样

参数 认证对象 用途
-U / --proxy-user 代理服务器 提交代理账号密码
-u / --user 目标网站或 API 提交目标服务的用户凭证

3. Basic 之外的 HTTP 代理认证

cURL 对 HTTP 代理默认使用 Basic。代理要求其他认证方案时,可使用 --proxy-anyauth 让 cURL 根据代理返回的挑战选择支持的方式,或按明确要求使用 --proxy-digest--proxy-ntlm--proxy-negotiate。这些选项针对 HTTP 代理认证,不是 SOCKS5 认证参数。

使用普通 HTTP 代理时,Basic 认证本身不负责加密代理凭证;如果客户端到代理服务器之间的链路不可信,应结合 HTTPS Proxy 或受保护的网络环境使用。

4. 用户名或密码包含特殊字符怎么办?

使用 -U 'username:password' 时,优先让凭证与代理 URL 分开,并按当前 Shell 的规则正确引用。如果把凭证直接嵌入代理 URL,@:#% 等字符可能需要百分号编码。本文不重复完整编码表;如果已经出现 407,可进入 407 Proxy Authentication Required 专项排查

六、怎么用 cURL 检查代理出口 IP?

验证代理是否真正生效,不要只看命令是否返回 200。最直接的方法是先查询一次直连公网 IP,再用同一台机器经过代理查询,并比较结果。

1. 不走代理查询公网 IP

curl https://api.ipify.org

2. 使用代理再次查询

curl -x http://proxy.example.com:7778 \
  -U 'username:password' \
  https://api.ipify.org

3. 比较两次结果

正常使用独立代理出口时,代理请求返回的公网地址通常应与直连公网 IP 不同,并与购买或提取的代理地区相符。需要检查国家、城市和 ASN 时,可以把测试地址换成返回地理与网络信息的查询接口;不同 GEO 数据库可能存在差异,验收时应固定同一查询来源。仍分不清本地 IP、公网 IP 和代理出口时,可参考 电脑IP查询与代理出口判断方法

代理类型或目标 怎么重复测试 预期结果
固定代理 间隔执行多次,并在业务周期内复测 出口 IP 保持为分配的固定地址
Sticky Session 按服务商规则保持同一 Session 参数 会话有效期内出口保持一致
轮换代理 按套餐轮换规则发起多次新请求或新会话 出口按规则发生变化,而不是始终返回本地 IP
指定国家或城市 检查 IP、国家、城市和 ASN 结果与选定位置及服务商说明一致
cURL直连与通过代理查询公网出口IP的终端结果对比示意
cURL 出口验证示意:分别记录直连与代理请求结果,并对账号、密码与完整认证信息脱敏。

如果使用 IPWeb 动态代理,账号中的地区、时效和 Session 参数应以 IPWeb 动态代理使用指南为准,不要根据其他服务商的用户名格式直接套用。

七、怎么用环境变量设置 cURL 代理?

需要让一组 cURL 命令默认经过代理时,可以使用代理环境变量。下面是 POSIX Shell 示例:

export http_proxy="http://proxy.example.com:7778"
export HTTPS_PROXY="http://proxy.example.com:7778"
export ALL_PROXY="socks5h://proxy.example.com:1080"
export NO_PROXY="localhost,127.0.0.1,.example.com"
变量 作用 容易误解的地方
http_proxy 访问 HTTP 目标时使用的代理 cURL 出于安全原因只接受小写的 http_proxy
HTTPS_PROXY 访问 HTTPS 目标时使用的代理 变量名中的 HTTPS 描述目标协议;变量值仍可指向 http:// 代理
ALL_PROXY 没有更具体协议变量时使用的通用代理 协议专用变量存在时优先使用专用变量
NO_PROXY 列出不经过代理的主机、域名或地址范围 可能影响环境变量代理的使用范围,应结合当前命令参数一起检查

http_proxy 是特殊情况:cURL 出于安全原因不接受大写的 HTTP_PROXY;其他代理变量通常可以使用大小写形式。团队环境中最好统一命名规则,避免 Shell、CI/CD 和不同工具之间出现配置差异。

NO_PROXY / no_proxy 用于定义不经过代理的目标。如果发现部分域名没有按预期走代理,应检查当前环境中的代理变量和排除规则。需要明确覆盖排除列表时,可使用 --noproxy ""。如果命令同时使用显式代理参数和环境变量,建议通过 curl -v 确认实际连接方向。环境变量的大小写和匹配规则可在 cURL 代理环境变量文档中核对。

如果明明配置了代理但出口没有变化,检查当前 Shell 中遗留的代理变量、NO_PROXY、启动脚本和 CI/CD 环境;使用 curl -v 可以观察实际连接方向,但分享输出前必须脱敏代理用户名、认证头和其他敏感字段。

八、cURL 代理失败怎么排查?

错误或现象 优先检查 下一步
407 Proxy Authentication Required -U、账号密码、认证方案、来源 IP 白名单 先做最小请求;持续 407 时查看 完整的 407 代理认证排查流程
Could not resolve proxy Proxy Host 拼写、本机 DNS 单独确认代理主机名能够解析
Failed to connect Host、Port、防火墙和代理服务状态 确认端口开放,并核对服务商当前端点
Timeout 本地网络、代理可达性、目标网站响应 区分连接代理超时,还是代理连接目标站超时
HTTPS Proxy 证书错误 Proxy CA、证书链和代理主机名 配置正确 CA,不把跳过验证作为正式方案
SOCKS5 域名访问异常 socks5://socks5h:// 根据目标域名应由本机还是代理解析进行切换
配置代理但出口 IP 没变化 NO_PROXY、环境变量、当前参数和查询方式 比较直连与代理查询,并确认目标未命中绕过规则

排障时一次只改一个变量,并记录代理协议、Host、Port、认证方式、目标 URL、完整错误和发生时间。这样才能判断恢复来自哪项修改,而不是靠反复换命令碰运气。

九、cURL 代理常见问题

1. curl -x 是什么意思?

-x--proxy 的短写,用来指定代理协议、代理主机和端口。它后面填写代理地址,命令最后才是目标 URL。

2. -U-u 有什么区别?

-U 向代理服务器提交账号密码,-u 向目标网站或 API 提交账号密码。大小写不能混用。

3. HTTP 代理能不能访问 HTTPS 网站?

可以,前提是代理支持所需的隧道转发。代理地址仍写成 http://,目标 URL 写成 https://;目标使用 HTTPS 不会把代理自动变成 HTTPS Proxy。

4. HTTPS Proxy 和 HTTPS 网站有什么区别?

HTTPS Proxy 描述客户端到代理这一段使用 TLS;HTTPS 网站描述客户端通过代理访问的目标使用 HTTPS。两段连接可以分别判断,不能只看目标 URL。

5. socks5socks5h 有什么区别?

socks5:// 由本机解析目标域名,socks5h:// 把目标域名交给代理解析。它们不是两个不同版本的 SOCKS 协议。

6. 配了代理为什么出口 IP 没有变化?

先确认命令实际使用了 -x,目标没有命中 NO_PROXY,并用同一查询接口分别测试直连和代理结果。如果只有部分程序出口不变,应检查它们是否继承了不同的环境变量或根本没有调用 cURL。

完成配置后,至少确认三项结果:cURL 实际连接的代理端点、代理后的公网出口,以及重复请求时的出口表现。使用 Sticky Session 或轮换代理时,再按对应的 Session 与轮换规则复测。不要只以“命令没有报错”作为代理已经正确生效的标准。