我在 CURL 和 PHP 之间有问题。我尝试通过 EWS 连接到 Exchange 2010 服务器。与服务器的连接在命令行中使用 CURL 工作正常,但不能使用 PHP Curl 扩展。
我附上了一张带有调试信息的图像。在左侧,您会看到命令行输出,在右侧是 PHP 详细输出。当 PHP Curl 扩展抛出错误“协商身份验证时连接关闭(HTTP 1.0?)”,命令行继续执行第三个 HTTP 请求,结果是 HTTP/1.1 302 Found:
一些附加信息:
有人知道为什么 PHP Curl 扩展在第三个请求之前关闭连接吗?这是扩展程序的错误,我可以使用 PHP Curl 常量来避免这种情况还是有其他解决方案?
最佳答案
连接被关闭,因为服务器这么说。看你的截图,上面一行是“这里有什么问题?”点。
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
set 可能意味着服务器已经断开连接,并且在套接字级别检测到它。旁注:比较的两侧显示出非常不同的相互作用。在左边有一个几乎是空的
GET
请求(提供 Host
、 Authorization
、 User-Agent
和 Accept
header ),而在右侧有更复杂的 POST
请求(相同的 header 加上 Method
, SOAPAction
,一个空内容 Expect
用于继续)。
关于PHP + curl : Connection closure while negotiation auth (HTTP 1. 0?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58285435/