错误的请求.通过主机和系统上的 curl 连接到站点 [英] Bad Request. Connecting to sites via curl on host and system

查看:28
本文介绍了错误的请求.通过主机和系统上的 curl 连接到站点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在 php 中有这个 cURL 代码.

I have this cURL code in php.

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 数组中的单独项目.

Each of them individual items in the array $v.

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

When I upload the file on my host and run the code, what I get is :

400 错误请求

您的浏览器发送了无效请求.

Your browser sent an invalid request.

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

But when I run it on my system using command line PHP, what I get is

< 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 错误,也不清楚是什么特别意味着它或更具体:来源

This is more a comment than an answer: From your question it's not clear what specifically triggers the 400 error nor what especially means it or more concrete: the source of it.

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

Is that the output by your server? Is that some feedback (the curl response) that you output with your script?

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

To better debug things, I've come up with a slightly different form of configuration you might be interested in when using the curl extension. There is a nice function called curl_setopt_array which allows you to set multiple options at once. It will return false if one of the options fails. It allows you to configure your request in complete in front. So you can more easily inject and replace it with a second (debug) configuration:

$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);

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

This might help you to improve the code and to debug things.

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

Furthermore you're making use of the CURLOPT_VERBOSE option. This will put the verbose information into STDERR - so you can't track it any longer. Instead you can add it to the output as well to better see what's going on:

...
    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:
<pre>", !rewind($verbose), htmlspecialchars(stream_get_contents($verbose)), "</pre>
";
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_version:

Which should provide you the information needed to track things down if they are request/curl related. You can then easily change parameters and see if it makes a difference. Also compare the curl version you have installed locally with the one on the server. To obtain it, use curl_version:

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

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

Hope this helps you to track things down.

这篇关于错误的请求.通过主机和系统上的 curl 连接到站点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆