PHP + Curl:协商身份验证时关闭连接(HTTP 1.0?)

时间:2019-10-08 11:24:08

标签: php email curl exchangewebservices php-curl

我在CURL和PHP之间有问题。我试图通过EWS连接到Exchange 2010服务器。与服务器的连接可以在命令行中使用CURL正常运行,但不能与PHP Curl扩展名兼容。

我在映像中附加了调试信息。在左侧,您可以看到命令行输出,在右侧是PHP的详细输出。当PHP Curl Extension引发错误“协商身份验证时关闭连接(HTTP 1.0?)”时,命令行将继续第三个HTTP请求,并在HTTP / 1.1 302中找到结果:

log information

一些其他信息:

  • 我将此库用于CURL请求:https://github.com/jamesiarmes/php-ntlm/blob/master/src/SoapClient.php
  • 我们大约有80台交换服务器,没有问题。仅此服务器存在问题。我们的客户告诉了一个称为“ Sophos”的软件,该软件用作Web服务器的代理
  • CURLOPT_HTTPAUTH是CURLAUTH_NTLM
  • PHP版本7.3.1 / 7.3.9也经过测试
  • cURL信息7.63.0 / 7.52.1也已测试

有人知道为什么PHP Curl Extension在第三个请求之前关闭连接吗?这是扩展程序的错误吗?我可以使用PHP Curl常量来避免这种情况吗?还是有其他解决方案?

2 个答案:

答案 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请求(提供了HostAuthorizationUser-AgentAccept标头),而右侧是更复杂的POST请求(相同的标头加上MethodSOAPAction,带有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

我希望这可以帮助

相关问题