Php

通過 HTTP 代理的 Apache curl

  • November 30, 2010

我試圖讓 PHP 執行與另一台伺服器的 curl 連接。要連接到伺服器,我們需要通過代理。在 bash 中,我們設置了 env 變數 http_proxy,這在從命令行使用 php 腳本時可以正常工作。但是,當嘗試從 apache 執行 curl 或 wget 時,它會失敗且沒有錯誤。伺服器配置了基於 Centos 預設設置的 SELinux。由於我不確定 SELinux 配置,所以這一直沒有改變。有沒有其他人有類似的問題?

在 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 下工作。

您是否告訴 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);

引用自:https://serverfault.com/questions/207052