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

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

问题描述

我有这个 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 的内容是



The contents of HTTPHEADER are ;

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 中。

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

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,但工作在谷歌和其他人。

任何帮助。

推荐答案

这是一个评论比答案:从你的问题不清楚什么具体触发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.

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

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 wiht 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:\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版本进行比较。要获得它,请使用 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天全站免登陆