大家早
基本上,由于涉及代理服务器的问题,我无法从Windows 7开发PC向内部和外部服务器发出成功的cURL请求。 我在Apache 2.4上运行cURL 7.21.2到PHP 5.3.6。
这是一个最基本的请求失败:
<?php $curl = curl_init('http://www.google.com'); $log_file = fopen(sys_get_temp_dir() . 'curl.log', 'w'); curl_setopt_array($curl, array( CURLOPT_RETURNTRANSFER => TRUE, CURLOPT_VERBOSE => TRUE, CURLOPT_HEADER => TRUE, CURLOPT_STDERR => $log_file, )); $response = curl_exec($curl); @fclose($log_file); print "<pre>{$response}";
接收到以下(完整)响应。
HTTP/1.1 400 Bad Request Date: Thu, 06 Sep 2012 17:12:58 GMT Content-Length: 171 Content-Type: text/html Server: IronPort httpd/1.1 Error response Error code 400. Message: Bad Request. Reason: None.
由cURL生成的日志文件包含以下内容。
* About to connect() to proxy usushproxy01.unistudios.com port 7070 (#0) * Trying 216.178.96.20... * connected * Connected to usushproxy01.unistudios.com (216.178.96.20) port 7070 (#0) > GET http://www.google.com HTTP/1.1 Host: www.google.com Accept: */* Proxy-Connection: Keep-Alive < HTTP/1.1 400 Bad Request < Date: Thu, 06 Sep 2012 17:12:58 GMT < Content-Length: 171 < Content-Type: text/html < Server: IronPort httpd/1.1 < * Connection #0 to host usushproxy01.unistudios.com left intact
如下所示,显式声明代理和用户凭证没有区别:响应始终是相同的。
<?php $curl = curl_init('http://www.google.com'); $log_file = fopen(sys_get_temp_dir() . 'curl.log', 'w'); curl_setopt_array($curl, array( CURLOPT_RETURNTRANSFER => TRUE, CURLOPT_VERBOSE => TRUE, CURLOPT_HEADER => TRUE, CURLOPT_STDERR => $log_file, CURLOPT_PROXY => 'http://usushproxy01.unistudios.com:7070', CURLOPT_PROXYUSERPWD => '<username>:<password>', )); $response = curl_exec($curl); @fclose($log_file); print "<pre>{$response}";
我很惊讶地看到请求行中有一个绝对的URL('GET …'),但是我认为在处理代理服务器时很好 – 根据HTTP规范。
我已经尝试了各种各样的选项组合 – 包括发送用户代理,跟随这个和那个等等 – 已经通过堆栈溢出问题和其他站点,但是所有的请求以相同的响应结束。
如果我在命令行上运行脚本,会发生同样的问题,所以它不能成为Apache的问题,对吧?
如果我使用cURL从同一networking上的Linux机器发出请求,则不会遇到问题。
这是令人困惑的“不良要求”的东西:我的要求到底是什么问题? 你有什么想法,为什么我可能遇到这个问题? Windows的东西? 我正在使用的PHP / cURL版本中的错误?
任何帮助非常感激地收到。 非常感谢。
您可能正在查看cURL(Windows和Linux之间的不同版本)和IronPort版本之间的问题。 在IronPort文档中:
修复:Web代理使用代理连接标头而不是连接标头,导致一些用户代理的问题
以前,Web代理在使用显式转发请求与用户代理进行通信时使用代理连接标头而不是连接标头。 正因为如此,某些用户代理(如Real Player)没有按预期工作。 这不再发生。 现在,除代理连接标头以外,Web代理还使用连接标头回复客户端。 [缺陷编号:46515]
尝试删除Proxy-Connection
(或添加Connection
)标题,看看是否解决了这个问题。
另外,您可能想要比较Windows和Linux主机之间的cURL日志。