我在CURL和PHP之间有问题。我试图通过EWS连接到Exchange 2010服务器。与服务器的连接可以在命令行中使用CURL正常运行,但不能与PHP Curl扩展名兼容。
我在映像中附加了调试信息。在左侧,您可以看到命令行输出,在右侧是PHP的详细输出。当PHP Curl Extension引发错误“协商身份验证时关闭连接(HTTP 1.0?)”时,命令行将继续第三个HTTP请求,并在HTTP / 1.1 302中找到结果:
一些其他信息:
有人知道为什么PHP Curl Extension在第三个请求之前关闭连接吗?这是扩展程序的错误吗?我可以使用PHP Curl常量来避免这种情况吗?还是有其他解决方案?
答案 0 :(得分:3)
连接已关闭,因为服务器这样说。请查看您的屏幕截图,在“问题出在哪里?”上方的一行上。点。
HTTP/1.1 401 Unauthorized [...] Connection: close Content-Type: application/x-asmx
然后服务器可能会关闭连接。
这不是一个动作,而是一个结果。该消息在Curl_http_readwrite_headers
中发出:
#if defined(USE_NTLM)
if(conn->bits.close &&
(((data->req.httpcode == 401) &&
(conn->http_ntlm_state == NTLMSTATE_TYPE2)) ||
((data->req.httpcode == 407) &&
(conn->proxy_ntlm_state == NTLMSTATE_TYPE2)))) {
infof(data, "Connection closure while negotiating auth (HTTP 1.0?)\n");
data->state.authproblem = TRUE;
}
#endif
#if defined(USE_SPNEGO)
if(conn->bits.close &&
(((data->req.httpcode == 401) &&
(conn->http_negotiate_state == GSS_AUTHRECV)) ||
((data->req.httpcode == 407) &&
(conn->proxy_negotiate_state == GSS_AUTHRECV)))) {
infof(data, "Connection closure while negotiating auth (HTTP 1.0?)\n");
data->state.authproblem = TRUE;
}
大概是从第一个区块(NTLM)开始,但是这是两次出现,而且它们彼此相邻。
有趣的事实:只有a lot later的同一功能检查Connection: close
标头的存在,因此设置神秘标记conn->bits.close
可能意味着服务器已经断开了连接,并且在套接字级别被检测到。
侧面说明:比较的两个方面显示出非常不同的相互作用。左侧实际上是一个空的GET
请求(提供了Host
,Authorization
,User-Agent
和Accept
标头),而右侧是更复杂的POST
请求(相同的标头加上Method
,SOAPAction
,带有Expect
的空内容以继续)。
答案 1 :(得分:1)
我通过使用SoapClient遇到了类似的问题 和Microsoft Exchange 2010 Server,诀窍是通过更改标题数组选项“期望:100-继续” 来“期望:200-ok ”
protected function buildHeaders($action)
{
return array(
'Method: POST',
'Connection: Keep-Alive',
'User-Agent: PHP-SOAP-CURL',
'Content-Type: text/xml; charset=utf-8',
"SOAPAction: \"$action\"",
'Expect: 200-ok',
);
}
状态为100(继续)的代码表示请求的初始部分已收到,但尚未被服务器拒绝。
200(OK)状态代码表示请求已成功完成。成功的含义因HTTP方法而异。
您还可以查看HTTP status codes
我希望这可以帮助