PHP cURL内容长度和内容类型错误

时间:2012-02-05 19:15:30

标签: php curl header request

我正在尝试通过PHP cURL登录网站,我只收到“错误请求”回复。

我使用hosts文件并将其设置到我的服务器,以检查我的浏览器发送的请求标头,并将其与cURL发送的请求标头进行比较。

一切都是平等的,除了:

浏览器:

Content-Type: application/x-www-form-urlencoded
Content-Length: 51

PHP cURL:

Content-Length: 51, 359
Content-Type: application/x-www-form-urlencoded; boundary=----------------------------5a377b7e6ba7

我已经使用此命令设置了这些值,但它仍然发送了错误的标题:

curl_setopt($this->hCurl, CURLOPT_HTTPHEADER, array(
    'Expect:',
    'Content-Type: application/x-www-form-urlencoded',
    'Content-Length: 51' 
));

1 个答案:

答案 0 :(得分:31)

您不必自己设置内容长度。如果您使用cURL发送HTTP POST,它将为您计算内容长度。

如果将CURLOPT_POSTFIELDS值设置为数组,它将自动以multipart/form-data提交请求并使用边界。如果您传递字符串,它将使用application/x-www-form-urlencoded,因此请确保将urlencoded字符串传递给CURLOPT_POSTFIELDS而不是数组,因为您需要使用form-urlencoded。

你需要这样做:

$data = 'name=' . urlencode($value) . '&name2=' . urlencode($value2);
curl_setopt($this->hCurl, CURLOPT_POSTFIELDS, $data);

// NOT

$dataArray = array('name' => 'value', 'name2' => 'value2');
curl_setopt($this->hCurl, CURLOPT_POSTFIELDS, $dataArray);

在任何一种情况下,您都不需要设置内容长度,但必须使用第一种方法在表单上获取application/x-www-form-urlencoded编码。

如果这没有用,请发布与设置curl请求相关的所有代码(所有选项以及传递给它的数据),这应该有助于解决问题。

编辑:

添加了一个我想出的示例(我登录失败)。

<?php

$URL_HOME  = 'http://ilocalis.com/';
$LOGIN_URL = 'https://ilocalis.com/login.php';

$ch = curl_init($URL_HOME);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

$home = curl_exec($ch);

//echo $home;

$post = array('username' => 'drew', 'password' => 'testing 123');
$query = http_build_query($post);

curl_setopt($ch, CURLOPT_URL, $LOGIN_URL);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $query);

$login = curl_exec($ch);

echo $login;