【发布时间】:2011-12-01 15:07:58
【问题描述】:
你好,
我目前正在编写一个客户端来访问 Microsoft Exchange 服务器并从中读取联系人、约会等。
通过几天的搜索,我已经能够通过 PHP 的 Soap 客户端和自定义 HTTPS 流包装器连接到 EWS。 This 网站在这一点上对我帮助很大。
使用 XAMPP 在我的 Windows 7 机器上一切正常
现在我将我的项目上传到 Debian 6.0 Squeeze 开发机器上,该机器在 web 服务器、php 设置、mysql 设置等方面与我的 Windows 机器具有完全相同的配置,但它不再工作了
debian机器可以解析和ping交换服务器没有问题
我将实际问题归结为 cURL 无法检索 EWS 的 WSDL 文件
它总是收到一个空响应和一个 401(未授权)状态码
我使用的凭据是正确的,相同的凭据在我的 Windows 机器上工作
我提取了错误的代码并尝试单独运行它,它看起来像这样:
echo "Trying to get https://".$cfg[ 'Exchange.Server' ]."/EWS/Services.wsdl<br>";
$curl = curl_init( 'https://'.$cfg[ 'Exchange.Server' ].'/EWS/Services.wsdl' );
curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1 );
curl_setopt( $curl, CURLOPT_HTTPAUTH, CURLAUTH_NTLM );
curl_setopt( $curl, CURLOPT_USERPWD, $cfg[ 'Exchange.User' ].':'.$cfg[ 'Exchange.Password' ] );
curl_setopt( $curl, CURLOPT_SSL_VERIFYPEER, false );
curl_setopt( $curl, CURLOPT_SSL_VERIFYHOST, false );
echo '<pre>';
$response = curl_exec( $curl );
$info = curl_getinfo( $curl );
var_dump( $info );
var_dump( $response );
curl_close( $curl );
我在这里收到的结果是提到的 401 状态代码和一个空响应 当我在浏览器中调用相同的 url 或在我的 windows 机器上使用相同的代码时,我得到了我想要的 WSDL 文件
实际上,我什至无法判断这是基于 linux 的问题,还是我在某些时候做错了什么,我已经为此苦苦挣扎了 2 天。
有没有人能找出我的错误或告诉我为什么它不起作用?
我可以根据需要提供任何进一步需要的信息
【问题讨论】:
-
您是否也尝试在命令行上获取文件,例如使用
curl命令行工具?它可以揭示相当多的信息。 -
是的,我使用命令行工具“curl”尝试了同样的事情,使用参数 -k(忽略无效证书)、--ntlm(NTLM 身份验证)和 -u 作为我的用户凭据收到一个空响应
-
启用详细输出,我认为是
-v,检查--help。对于证书等 IIRC,还有一些其他“调试”选项。 -
似乎与您客户端上的 NTLM 库有关....
-
在这种情况下我不使用任何 NTLM 库,cURL 内置了 NTLM 身份验证 -v 指出我犯的一个错误,即使用 \\ 而不是 \ 作为我的用户名的域分隔符,不过,我仍然收到 401 响应
标签: php curl ntlm exchangewebservices http-status-code-401