我尝试使用php脚本中的curl访问web:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://www.google.fr");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Error:' . curl_error($ch);
}
curl_close ($ch);
它返回:
无法连接到www.google.fr端口443:拒绝连接
这是正常的,我在代理后面,需要我的Windows凭据(NTLM)来允许互联网流量。
在MS Powershell中,这有效:
$request = New-Object System.Net.WebCLient
$request.UseDefaultCredentials = $true
$request.Proxy.Credentials = $request.Credentials
$request.DownloadFile($url, $path)
使用“DefaultCredentials”(= Windows Credentials)并将其发送到代理允许我访问网络。但我现在不知道它是如何运作的。
如果我使用Firefox导航,Firefox总是添加代理授权标头,其值为: Negociate blablablablababalazdlad ...
我想将.NET useDefaultCredentials解决方案转换为cURL,我试过了:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://www.google.fr");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_NTLM );
curl_setopt($ch, CURLOPT_PROXYAUTH, CURLAUTH_NTLM );
$result = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Error:' . curl_error($ch);
}
curl_close ($ch);
没有成功
答案 0 :(得分:2)
curl可以使用" SSPI "支持已启用。您可以在提示符上正常运行curl -V
来检查。或者来自PHP本身的php -i
或调用phpinfo();
。
您将CURLOPT_PROXYUSERPWD
选项设置为空白用户/密码(除了其他选项外)只是为了触发身份验证,但它会为您获取默认凭据:
curl_setopt($ch, CURLOPT_PROXYUSERPWD, ":" );
完整的代码看起来如下所示。另请注意,CURLOPT_HTTPAUTH
用于对远程服务器进行身份验证,而不是代理。而且我认为你不太可能真的想要google的HTTP身份验证......
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://www.google.fr");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_PROXY, "http://proxyhost.example.com:8080/");
curl_setopt($ch, CURLOPT_PROXYAUTH, CURLAUTH_NTLM );
curl_setopt($ch, CURLOPT_PROXYUSERPWD, ":" );
$result = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Error:' . curl_error($ch);
}
curl_close ($ch);
然后curl无法找出默认凭据,而是必须使用CURLOPT_PROXYUSERPWD
选项设置用户名和密码,如下所示:
curl_setopt($ch, CURLOPT_PROXYUSERPWD, "clark%20kent:superman");
答案 1 :(得分:2)
我尝试在php脚本中使用curl访问web: https://www.google.fr
问题是google内容是通过ssl提供的,即https:我修改了你的代码以允许https连接:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://www.google.fr");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, FALSE );
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, FALSE );
curl_setopt( $ch, CURLOPT_USERAGENT,"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)");
$result = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Error:' . curl_error($ch);
}
curl_close ($ch);
print_r( $result );
使用HTTP NTLM身份验证| CURLAUTH_NTLM
HTTP NTLM身份验证。 Microsoft发明并使用的专有协议。它使用类似于Digest的质询 - 响应和散列概念,以防止密码被窃听。
您需要使用 OpenSSL , GnuTLS 或 NSS 支持此选项来构建libcurl,或者构建libcurl支持SSPI的Windows。
让我们把它放到一个简单的函数中。
function Auth($username, $password, $endpoint)
{
$username = ( isset( $username ) && !empty($username) ) ? trim( $username ) : '';
$password = ( isset( $password ) && !empty($password) ) ? trim( $password ) : '';
$proxy_address = "local.domain.com:1024";
$ch = curl_init();
if($ch)
{
curl_setopt($ch, CURLOPT_URL, $endpoint );
/* make use of proxy */
curl_setopt(curl, CURLOPT_PROXY, $proxy_address );
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
/* Allow ANY Auth */
curl_setopt(curl,CURLOPT_PROXYAUTH, CURLAUTH_ANY );
/* Set credentials or leave empty to prompt */
curl_setopt(curl,CURLOPT_PROXYUSERPWD, "$username:$password" );
$result = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Error:' . curl_error($ch);
}
curl_close($ch);
}
}
用法:验证(“用户名”,“yourPassWord”,“http://local.domain.com:1080/”);
让其他人知道这是否有助于您