PHP + curl : Connection closure while negotiation auth (HTTP 1. 0?)

标签 php email curl exchangewebservices php-curl

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

我附上了一张带有调试信息的图像。在左侧,您会看到命令行输出,在右侧是 PHP 详细输出。当 PHP Curl 扩展抛出错误“协商身份验证时连接关闭(HTTP 1.0?)”,命令行继续执行第三个 HTTP 请求,结果是 HTTP/1.1 302 Found:

log information

一些附加信息:

  • 我将此库用于 CURL 请求:https://github.com/jamesiarmes/php-ntlm/blob/master/src/SoapClient.php
  • 我们有大约 80 台交换服务器,没有问题。只有这台服务器有问题。我们的客户讲述了一个名为“Sophos”的软件用作网络服务器的代理
  • CURLOPT_HTTPAUTH 是 CURLAUTH_NTLM
  • PHP 7.3.1/7.3.9 也测试了
  • cURL 信息 7.63.0/7.52.1 也经过测试

  • 有人知道为什么 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请求(提供 HostAuthorizationUser-AgentAccept header ),而在右侧有更复杂的 POST请求(相同的 header 加上 MethodSOAPAction ,一个空内容 Expect 用于继续)。

    关于PHP + curl : Connection closure while negotiation auth (HTTP 1. 0?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58285435/

    相关文章:

    php - 创建图像而不将其存储为本地文件

    iphone - NSString 形式的 HTML 电子邮件模板

    c# - 在 C# 中使用 AWS SES API 时缺少来自 "name"的电子邮件

    php - 如何将 linux 命令 CURL 转换为 PHP

    php - preg_match,是什么导致了错误?

    php - dataurl 到图像以在 php 中下载

    php - 推进 "AND NOT"查询

    email - 来自非安全服务器的 HTTPS 重定向在浏览器中给出错误消息

    c - 最后修改字段和下载文件

    linux - 如何在 Bash for 循环中同时访问两个数组索引以获取 curl 请求?