php - 错误的请求。通过主机和系统上的 curl 连接到站点

标签 php curl header

我在 php 中有这个 cURL 代码。

curl_setopt($ch, CURLOPT_URL, trim("http://stackoverflow.com/questions/tagged/java")); 
curl_setopt($ch, CURLOPT_PORT, 80); //ignore explicit setting of port 80
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_ENCODING, "");
curl_setopt($ch, CURLOPT_HTTPHEADER, $v);
curl_setopt($ch, CURLOPT_VERBOSE, true);

HTTPHEADER的内容是;

Proxy-Connection: Close
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1017.2 Safari/535.19
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: __qca=blabla
Connection: Close

数组 $v 中的每一项。

当我在我的主机上上传文件并运行代码时,我得到的是:

400 Bad request

Your browser sent an invalid request.

但是当我使用命令行 PHP 在我的系统上运行它时,我得到的是

< HTTP/1.1 200 OK
< Vary: Accept-Encoding
< Cache-Control: private
< Content-Type: text/html; charset=utf-8
< Content-Encoding: gzip
< Date: Sat, 03 Mar 2012 21:50:17 GMT
< Connection: close
< Set-Cookie: buncha cokkies; path=/; HttpOnly
< Content-Length: 22151
< 
* Closing connection #0

.

这不仅发生在 stackoverflow 上,也发生在 4shared 上,但适用于 google 和其他公司。

感谢您的帮助。

最佳答案

这与其说是回答,不如说是评论:从你的问题来看,不清楚是什么具体触发了 400 错误,也不清楚是什么特别意味着它或更具体:它的来源。

这是您的服务器的输出吗?这是您使用脚本输出的一些反馈(curl 响应)吗?

为了更好地调试,我提出了一种稍微不同的配置形式,您在使用 curl 扩展时可能会对它感兴趣。有一个很好的函数叫做 curl_setopt_array这允许您一次设置多个选项。如果其中一个选项失败,它将返回 false。它允许您在前面完整地配置您的请求。因此,您可以更轻松地注入(inject)并用第二个(调试)配置替换它:

$curlDefault = array(
    CURLOPT_PORT => 80, // ignore explicit setting of port 80
    CURLOPT_RETURNTRANSFER => TRUE,
    CURLOPT_FOLLOWLOCATION => TRUE,
    CURLOPT_ENCODING => '',
    CURLOPT_HTTPHEADER => array(
        'Proxy-Connection: Close',
        'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1017.2 Safari/535.19',
        'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
        'Accept-Encoding: gzip,deflate,sdch',
        'Accept-Language: en-US,en;q=0.8',
        'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3',
        'Cookie: __qca=blabla',
        'Connection: Close',
    ),
    CURLOPT_VERBOSE => TRUE, // TRUE to output verbose information. Writes output to STDERR, or the file specified using CURLOPT_STDERR.
);

$url = "http://stackoverflow.com/questions/tagged/java";
$handle = curl_init($url);
curl_setopt_array($handle, $curlDefault);
$html = curl_exec($handle);
curl_close($handle);

这可能会帮助您改进代码并进行调试。

此外,您还使用了 CURLOPT_VERBOSE 选项。这会将详细信息放入 STDERR - 因此您无法再跟踪它。相反,您也可以将它添加到输出中以更好地查看发生了什么:

...
    CURLOPT_VERBOSE => TRUE, // TRUE to output verbose information. Writes output to STDERR, or the file specified using CURLOPT_STDERR.
    CURLOPT_STDERR => $verbose = fopen('php://temp', 'rw+'),
);

$url = "http://stackoverflow.com/questions/tagged/java";
$handle = curl_init($url);
curl_setopt_array($handle, $curlDefault);
$html = curl_exec($handle);
$urlEndpoint = curl_getinfo($handle, CURLINFO_EFFECTIVE_URL);
echo "Verbose information:\n<pre>", !rewind($verbose), htmlspecialchars(stream_get_contents($verbose)), "</pre>\n";
curl_close($handle);

它给出了以下输出:

Verbose information:
* About to connect() to stackoverflow.com port 80 (#0)
*   Trying 64.34.119.12...
* connected
* Connected to stackoverflow.com (64.34.119.12) port 80 (#0)
> GET /questions/tagged/java HTTP/1.1
Host: stackoverflow.com
Proxy-Connection: Close
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1017.2 Safari/535.19
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: __qca=blabla
Connection: Close

< HTTP/1.1 200 OK
< Cache-Control: private
< Content-Type: text/html; charset=utf-8
< Content-Encoding: gzip
< Vary: Accept-Encoding
< Date: Mon, 05 Mar 2012 17:33:11 GMT
< Connection: close
< Content-Length: 10537
< 
* Closing connection #0

如果它们与请求/ curl 相关,它应该为您提供跟踪事物所需的信息。然后您可以轻松更改参数并查看是否有所不同。还要比较您本地安装的 curl 版本与服务器上的版本。要获取它,请使用 curl_version:

$curlVersion = curl_version();
echo $curlVersion['version']; // e.g. 7.24.0

希望这可以帮助您追踪事情。

关于php - 错误的请求。通过主机和系统上的 curl 连接到站点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9550319/

相关文章:

php - 获取值中的点(句号)会破坏 SQL 查询 (PDO)

PHP 连接 mysql 超时

php - 仅在 WooCommerce 单个产品页面上添加价格后缀,没有链接产品

curl - 当变量不满足rundeck中的条件时显示错误消息

html - CSS/HTML 似乎无法使菜单标题居中

Angular 2 基本身份验证不起作用

php - wp_posts.id 值超过 9 位会导致帖子和权限问题

ruby-on-rails - 将 curl 转换为等效的 ruby

c++ - 多线程curl应用存在内存分配问题

java - 生成 Java JNI header