php curl with digest返回两个响应

时间:2012-10-23 08:52:23

标签: php curl

我发现了一个“奇怪的”PHP CURL行为让我疯了。基本上我正在做的是使用curl进行摘要认证调用。这是我的代码的摘录:

curl_setopt($this->c, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);
curl_setopt($this->c, CURLOPT_USERPWD, $username . ":" . $password);

它工作正常,服务器实际上回来了“是,你提供正确的证书”的消息。唯一的麻烦是,原始的http响应有点奇怪,因为它包括,事实上,2个响应而不是一个。以下是curl_exec($ this-> c)吐出的内容:

HTTP/1.0 401 Unauthorized
Date: Tue, 23 Oct 2012 08:41:18 GMT
Server: Apache/2.2.20 (Ubuntu)
X-Powered-By: PHP/5.3.6-13ubuntu3.9
WWW-Authenticate: Digest realm="dynamikrest-testing",qop="auth",nonce="5086582e95104",opaque="4b24e95490812b28b3bf139f9fbc9a66"
Vary: Accept-Encoding
Content-Length: 9
Connection: close
Content-Type: text/html

HTTP/1.1 200 OK
Date: Tue, 23 Oct 2012 08:41:18 GMT
Server: Apache/2.2.20 (Ubuntu)
X-Powered-By: PHP/5.3.6-13ubuntu3.9
Vary: Accept-Encoding
Content-Length: 9
Connection: close
Content-Type: text/html

"success"

我不明白为什么它包含来自服务器的第一个响应(它声明它需要身份验证的响应)。

任何人都可以对这个问题有所了解吗?如何避免回复累积?

干杯

2 个答案:

答案 0 :(得分:2)

如果对标题使用-I选项,则看起来curl具有相同的行为:

curl -I  --digest -u root:somepassword http://localhost/digest-test/

返回:

HTTP/1.1 401 Authorization Required
Date: Fri, 31 May 2013 13:48:35 GMT
Server: Apache/2.2.22 (Ubuntu)
WWW-Authenticate: Digest realm="Test Page", nonce="9RUL3wPeBAA=52ef6531dcdd1de61f239ed6dd234a3288d81701", algorithm=MD5, domain="/digest-test/ http://localhost", qop="auth"
Vary: Accept-Encoding
Content-Type: text/html; charset=iso-8859-1

HTTP/1.1 200 OK
Date: Fri, 31 May 2013 13:48:35 GMT
Server: Apache/2.2.22 (Ubuntu)
Authentication-Info: rspauth="4f5f8237e9760f777255f6618c21df4c", cnonce="MTQ3NDk1", nc=00000001, qop=auth
Vary: Accept-Encoding
Content-Type: text/html;charset=UTF-8
X-Pad: avoid browser bug

要获得第二个标题,您可以尝试这个(不是非常理想的解决方案):

<?php

$ch = curl_init();
        // set url
curl_setopt($ch, CURLOPT_URL, "http://localhost/digest-test/");
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);
curl_setopt($ch, CURLOPT_USERPWD, "root:test");


// first authentication with a head request
curl_setopt($ch, CURLOPT_NOBODY, 1);
curl_exec($ch);        

// the get the real output
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_HTTPGET, 1);
$output = curl_exec($ch);
echo $output;

答案 1 :(得分:0)

我遇到了同样的问题,我认为这是因为PHP是针对古老版本的libcurl编译的(在我的情况下是7.11.0,现在已经有近10年了)。在具有更新版本的libcurl(7.29.0)的另一台机器上,相同的代码很好,我的问题在让我的主机重新编译它们的PHP以使用它们可用的最新版本(7.30.0)后结束。

此修复程序由a thread on the curl-library mailing list from 2008建议,其中用户发现问题影响版本7.10.6但不是7.12.1。我搜索了libcurl changelog around 7.12.0并没有找到任何有关修复此问题的明确条目,尽管它可能会被“常规HTTP身份验证改进”所涵盖。不过,我现在非常有信心,旧的libcurl就是问题所在。

您可以从phpinfo();

的输出中的'cURL Information'条目中查看PHP使用的libcurl版本