通过 HTTP 代理的 Apache curl

通过 HTTP 代理的 Apache curl

我正在尝试让 PHP 执行与另一台服务器的 curl 连接。要连接到服务器,我们需要通过代理。在 bash 中,我们设置了环境变量 http_proxy,这在使用命令行中的 php 脚本时可以正常工作。但是,当尝试执行 curl 或从 apache 执行 wget 时,它会失败且没有任何错误。服务器根据 Centos 默认设置配置了 SELinux。这一直没有改变,因为我不确定 SELinux 配置。有其他人遇到过类似的问题吗?

答案1

在 SELinux 下,httpd(及其子进程)不允许建立传出连接。请尝试

setsebool -P httpd_can_network_connect 1

/var/log/messages如果/var/log/audit/audit.log事实上 selinux 是原因,您应该会看到消息。

如果您是第一次在 selinux 下运行 apache,请查看httpd_selinux(8)

编辑以添加:PS 如果您不是 selinux 专家,计划花费大量时间尝试让即使是稍微不寻常的 apache 配置也能在 selinux 下工作。

答案2

您是否告诉过 curl 它需要通过代理连接?

$curlHandle=curl_init();
curl_setopt($curlHandle, CURLOPT_URL, 'http://www.google.com');
curl_setopt($curlHandle, CURLOPT_HTTPPROXYTUNNEL, true);
curl_setopt($curlHandle, CURLOPT_PROXYPORT, 8080);
curl_setopt($curlHandle, CURLOPT_PROXY, 'proxy.localnet.com');
// optional
// curl_setopt($curlHandle, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
// curl_setopt($curlHandle, CURLOPT_PROXYUSERPWD, 'user:s3cr3t'); 
// curl_setopt($curlHandle, CURLOPT_PROXYAUTH, CURLAUTH_NTLM);

$out=curl_exec($curlHandle);

curl_close($curlHandle);

相关内容