使用PHP通过身份验证代理检索URL

使用PHP通过身份验证代理检索URL,php,proxy,Php,Proxy,我试图通过需要身份验证的代理服务器为安全(密码保护+https)URL的检索编写脚本。我发现了许多关于如何使用“代理”选项以及如何使用stream\u context\u create发送凭据的示例 $url = "https://$server/$uri"; $cred = sprintf('Authorization: Basic %s\r\n', base64_encode("$user:$pass")); $options['header']=$cred; $options['proxy

我试图通过需要身份验证的代理服务器为安全(密码保护+https)URL的检索编写脚本。我发现了许多关于如何使用“代理”选项以及如何使用stream\u context\u create发送凭据的示例

$url = "https://$server/$uri";
$cred = sprintf('Authorization: Basic %s\r\n', base64_encode("$user:$pass"));
$options['header']=$cred;
$options['proxy']="tcp://10.1.1.1:3128";
$params = array('http' => $options);
$ctx = stream_context_create($params);
$fp = @fopen($url, 'rb', false, $ctx);
但是,我没有找到向代理服务器提供uid/密码的任何位置。我试图手动添加标题:

$prox_cred = sprintf('Proxy-Connection: Keep-Alive\r\nProxy-Authorization: Basic %s\r\n', base64_encode("$proxy_user:$proxy_pass"));
$options['header'] .= $prox_cred;

我拥有对代理服务器的root访问权限,我可以看到我的请求命中它,但是当我查看流量时,我看不到我的头。我猜它们被添加到加密并发送到终端服务器的部分。

出于某种原因,我不想第一次使用cURL模块使事情复杂化。然而,根据我的回答,我尝试了一下,花了大约6分钟的时间让事情正常进行

if ($proxy_server != '') {
  curl_setopt($ch,CURLOPT_PROXYAUTH,CURLAUTH_BASIC);
  curl_setopt($ch,CURLOPT_PROXY,"$proxy_server");
  if ($proxy_user != '') {
     curl_setopt($ch,CURLOPT_PROXYAUTH,CURLAUTH_BASIC);
     curl_setopt($ch,CURLOPT_PROXYUSERPWD,"$proxy_user:$proxy_pass");
  }  
}  

谢谢

不确定这是否会修复它,但将您的sprintf更改为
$cred=sprintf(“授权:基本%s\r\n”,base64_编码($user:$pass”)未计算CRLF序列,因为您使用了单引号。实际上,您正在将
\r\n
作为字符串的一部分。还有,你为什么不/不能使用cURL?它支持授权和代理。您能使用curl使代理凭据正常工作吗?如果你能做到这一点,那么至少你知道代理正在使用你的凭据(在你深入挖掘标题之前)。这是一个不错的形式,发布此消息可能会对未来的用户有所帮助。请考虑单击此答案旁边的复选标记,以提醒其他人工作。