我正在尝试通过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'
));
答案 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;