一台拥有多个本地地址的机器可能需要用其中之一来连接正向代理。cURL 可以把这两个选择都明确指定出来:

curl_setopt_array($handle, [
    CURLOPT_URL => 'https://example.com/',
    CURLOPT_INTERFACE => '192.0.2.20',
    CURLOPT_PROXY => 'http://proxy.example:8080',
]);

这是针对已有 cURL 句柄的示例配置。请把 192.0.2.20 换成运行 PHP 的机器上确实可用的源地址。若要在没有代理账户的情况下发起被允许的公网请求,HTTP 代理列表可以为代理参数提供远端监听端点。

CURLOPT_INTERFACE 选择出站连接的本地一侧。CURLOPT_PROXY 选择把请求继续转发的中间节点。选择本地源并不会把这台机器变成远程代理,也不会让它凭空获得任意公网 IP。

在这条路径上,本地选择影响的是通往代理的那一段连接。网站通常看到的是代理继续转发时的源地址。任意一对对端之间的 NAT 还会进一步改写各自看到的地址。

如果省略接口选择,libcurl 会让 TCP 协议栈自行挑选合适的源地址。这一选择取决于机器的网络配置,并不存在"配置文件里第一个地址获胜"的通用规则。

libcurl 在受支持的平台上接受接口名,但其文档明确排除在该选项中使用 Windows 的接口名。使用主机名也可能触发一次阻塞式解析。当应用本就打算选定源地址时,一个已知的本地地址是更清晰的输入。

相关文章