我试图通过
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' ));
你不必自己设置内容长度.如果您使用cURL发送HTTP POST,则会为您计算内容长度.
如果将CURLOPT_POSTFIELDS值设置为数组,它将自动将请求作为multipart / form-data提交,并使用边界.如果你传递一个字符串,它将使用application / x-www-form-urlencoded,所以确保将一个urlencoded字符串传递给CURLOPT_POSTFIELDS,而不是一个数组,因为你想要形式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,$dataArray);
在这两种情况下,您不需要设置内容长度,但您必须使用第一种方法来获取表单上的application / x-www-form-urlencoded encoding.
如果没有帮助,请发布与设置卷曲请求相关的所有代码(所有选项和您传递给它的数据),这有助于解决问题.
编辑:
<?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,$query); $login = curl_exec($ch); echo $login;