HTTP 411 PHP由于发布请求而卷曲 更新

问题描述

使用以下代码

<?PHP

function request($url,$post,$cook)
{
$ch = curl_init();
$cookie_file_path = "vskcookies.txt";

$urll = 'http://auto.vsk.ru/login.aspx';

$ch = curl_init();
curl_setopt($ch,CURLOPT_HEADER,true);
curl_setopt($ch,CURLOPT_NOBODY,false);
curl_setopt($ch,CURLOPT_URL,$urll);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,0);
curl_setopt($ch,CURLOPT_COOKIEJAR,$cookie_file_path);
curl_setopt($ch,CURLOPT_COOKIEFILE,CURLOPT_USERAGENT,'"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; Trident/7.0; Touch; .NET4.0C; .NET4.0E; Tablet PC 2.0)"');
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_REFERER,CURLOPT_SSL_VERIFYPEER,CURLOPT_FOLLOWLOCATION,CURLOPT_CUSTomrEQUEST,"POST");
curl_setopt($ch,CURLOPT_POST,CURLOPT_POSTFIELDS,$post);

curl_setopt( $ch,CURLOPT_COOKIESESSION,true );

$result = curl_exec($ch);

echo "FIELDS:\n\n".$post;
echo "\n\nHEADERS:\n\n";

curl_close($ch);
return $result;
}
$result = request($_POST['url'],$_POST['data'],$_POST['cook']);


if ($result === FALSE) 
 echo('error');
else
 echo($result);


?>

我需要获得两个cookie,但体内出现http 411错误

enter image description here

相同的请求,相同的代码,但最后,恰好在我添加curl_exec之前

curl_setopt($ch,CURLOPT_HTTPHEADER,array("Content-Type: application/x-www-form- urlencoded;charset=utf-8"));

结果,我得到正确的身体,但是现在只有一个cookie(我需要两个):

enter image description here

一个变体:

代码

curl_setopt($ch,CURLOPT_FRESH_CONNECT,true);

curl_setopt($ch,array('Cache-Control: no-cache;Content-Type: application/x-www-form- urlencoded;charset=utf-8;Content-Length: '.strlen($post)));

给出411错误并纠正Cookie的原因。

curl_setopt($ch,array('Content-Length:'.strlen($post)));

什么都不引起:什么也没发生。

在两个(第一个)变量之后,vskcookies.txt仅包含一个(池)cookie。

为什么?

看起来,当我添加标题时,它会删除请求的正文(帖子字段)。


更新

对于此代码

curl_setopt($ch,array('Cache-Control: no-cache;Content-Type: application/x-www-form- urlencoded;'));

我只是坐在页面上单击上面的脚本的ajax请求的按钮,每次都会收到411错误响应(而且每次更新标题中的cookie /时间),但是单击大约10次后,我得到了 http 200 和我需要的页面。然后再次多次411,再一次单个200。顺便说一下,cookies文件仍然只有一个cookie。

Wtf?

解决方法

正如我在问题更新中提到的那样,有时我会得到200响应,其中包含两个cookie和所需的正文。

所以我写了这是严重不稳定解决方案,通常可以保持大约20秒:

<?php

function request($url,$post,$cook)
{
$sta=0;

while($sta != '200')
{
$ch = curl_init();
$cookie_file_path = "vskcookies.txt";

$urll = 'http://auto.vsk.ru/login.aspx';

curl_setopt($ch,CURLOPT_HEADER,true);
curl_setopt($ch,CURLOPT_NOBODY,false);
curl_setopt($ch,CURLOPT_URL,$urll);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,0);
curl_setopt($ch,CURLOPT_COOKIEJAR,$cookie_file_path);
curl_setopt($ch,CURLOPT_COOKIEFILE,CURLOPT_USERAGENT,'"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; Trident/7.0; Touch; .NET4.0C; .NET4.0E; Tablet PC 2.0)"');
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_REFERER,CURLOPT_SSL_VERIFYPEER,CURLOPT_FOLLOWLOCATION,1);

curl_setopt($ch,CURLOPT_CUSTOMREQUEST,"POST");
curl_setopt($ch,CURLOPT_POST,CURLOPT_POSTFIELDS,$post);
curl_setopt($ch,CURLOPT_MAXREDIRS,10);
curl_setopt( $ch,CURLOPT_COOKIESESSION,true );
//curl_setopt($ch,CURLOPT_FRESH_CONNECT,CURLOPT_HTTPHEADER,array('Cache-Control: no-cache;Content-Type: application/x-www-form- urlencoded;'));
//curl_setopt($ch,CURLOPT_POSTREDIR,2);

$result = curl_exec($ch);

$sta = curl_getinfo($ch,CURLINFO_HTTP_CODE);

curl_close($ch);
}

echo "FIELDS:\n\n".$post;
echo "\n\nHEADERS:\n\n";

return $result;
}


$result = request($_POST['url'],$_POST['data'],$_POST['cook']);


if ($result === FALSE) 
 echo('error');
else
 echo($result);

 ?>

打赌,有一个更好的正确答案。