在Windows上发出PHP cURL请求会从代理中产生“400 Bad Request”

时间:2012-09-06 17:42:33

标签: php windows http curl proxy

早上好

基本上,由于涉及代理服务器的问题,我无法从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规范。

我尝试了各种各样的选项组合 - 包括发送用户代理,跟随此等等等 - 已经通过Stack Overflow问题和其他网站,但所有请求都以相同的响应结束。

如果我在命令行上运行脚本会出现同样的问题,因此它不能成为Apache问题,对吧?

如果我使用同一网络上 Linux 框中的cURL发出请求,我不会遇到问题。

令人困惑的是“糟糕请求”这件事:我的要求究竟出了什么问题?你知道我为什么会遇到这个问题吗?一个Windows的东西?我正在使用的PHP / cURL版本中的错误?

非常感谢非常的任何帮助。非常感谢。

1 个答案:

答案 0 :(得分:0)

您可能正在查看cURL(Windows和Linux之间的不同版本)与IronPort版本之间的问题。在IronPort文档中:

  

已修复:Web代理使用代理连接标头而不是       连接标头,导致某些用户代理出现问题

     

以前,Web代理使用Proxy-Connection标头而不是   与显式的用户代理通信时的连接头   转发请求。正因为如此,一些用户代理,如Real   玩家,没有按预期工作。这不再发生。现在,网络   除了以外,代理还使用Connection标头回复客户端   代理连接头。 [缺陷ID:46515]

尝试删除Proxy-Connection(或添加Connection)标头,看看是否能解决问题。

此外,您可能希望比较Windows和Linux主机之间的cURL日志。