html页面没有通过libcurl获取cookie

时间:2011-05-16 15:39:50

标签: php cookies curl

我修改了以前的代码。你可以看到我之前发布的帖子setting cookie through curl 但这是一个新的开始,我的新代码看起来像这样 我有一个像这样使用curl的php文件

<?php
$ch=curl_init();
$url="http://localhost/javascript%20cookies/test_cookies.php";
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_COOKIEFILE,dirname(__FILE__) . "/cookie.txt");
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);
curl_exec($ch);
curl_close($ch);
?>

文件 test_cookies.php 看起来像这样

<?php
if($_COOKIE['user']==1)
{
header("Set-Cookie:user=1; color=blue");
header("Location:http://localhost/javascript%20cookies/test_cookies.html");
}
?>

文件 test_cookies.html 有一些javascript检查Cookie,如果找到这些Cookie,则会相应地显示文本。 带有curl代码的php文件正在发送cookie, test_cookies.php 正在设置cookie并重定向到页面 test_cookies.html 但此页面未收到Cookie,因此未显示相应内容。 有人能告诉我现在的问题吗?

这里是我在firefox中将CURLOPT_HEADER设置为true

时显示的标题
HTTP/1.1 302 Found Date: Mon, 16 May 2011 15:03:59 GMT Server: Apache/2.2.14 (Win32) DAV/2 mod_ssl/2.2.14 OpenSSL/0.9.8l mod_autoindex_color PHP/5.3.1 mod_apreq2-20090110/2.7.1 mod_perl/2.0.4 Perl/v5.10.1 X-Powered-By: PHP/5.3.1 Set-Cookie: user=1; color=blue Location: http://localhost/javascript%20cookies/test_cookies.html Content-Length: 0 Content-Type: text/html HTTP/1.1 200 OK Date: Mon, 16 May 2011 15:03:59 GMT Server: Apache/2.2.14 (Win32) DAV/2 mod_ssl/2.2.14 OpenSSL/0.9.8l mod_autoindex_color PHP/5.3.1 mod_apreq2-20090110/2.7.1 mod_perl/2.0.4 Perl/v5.10.1 Last-Modified: Mon, 16 May 2011 12:13:24 GMT ETag: "11000000013d0c-493-4a363950a70f3" Accept-Ranges: bytes Content-Length: 1171 Content-Type: text/html

你可以看到显示了两组标题。这是因为我正在对标题进行2次调用吗?

2 个答案:

答案 0 :(得分:1)

目前尚不清楚您要使用代码实现的目标。如果你解释为什么要这样做,你会得到更好的帮助。您的方法很可能是错误的,您可以通过不同/更简单的方法获得最终结果。

现在回答你的问题,这就是:

  1. 在浏览器中,您向curl.php发送GET请求(我用于您的第一个文件的名称),
  2. 该文件中的curl检查cookie.txt并找到user=1,因此它向test_cookies.php发送GET请求并发送带有请求的Cookie
  3. test_cookies.php发现user=1为真,因此会向curl.php发送标题,并要求其设置两个Cookie:user=1color=blue(对于CURLOPT_COOKIEJAR第一个cookie是没有意义的,user = 1已经设置好,但是让我们忽略它,因为没有造成任何伤害)
  4. 您尚未设置curl.php选项,因此当test_cookies.php收到设置的Cookie标头时,它不会给出该死的(没有任何反应)
  5. 接下来,curl.phpCURLOPT_FOLLOWLOCATION,1发送重定向标头,因为您设置了curl.phptest_cookies.html发送了另一个GET请求,这次是test_cookies.html
  6. curl.php的内容将返回curl_exec($ch);
  7. test_cookies.html会将返回的内容(user的来源)回显给您的浏览器,
  8. 您的浏览器解析收到的内容并执行javascript。它检查名为curl_setopt($ch,CURLOPT_COOKIEJAR,dirname(__FILE__) . "/cookie.txt"); 的cookie并且找不到cookie,因此它显示没有cookie时的内容(因为没有cookie)。
  9. 现在,您可能想知道如果添加以下内容会发生什么:

    cookie.txt

    您的user=1将在步骤4中更新,并且会有两个Cookie,会发生什么? color=blueheader("Set-Cookie:user=1; color=blue");。但这并不能给你预期的结果。因为CURLOPT_COOKIEJAR指示curl设置cookie,curl通过将cookie存储在cookie.txt选项中指定的文件中来完成此操作。因此,即使您添加了该选项,当您到达第8步时,javascript也无法找到该Cookie,因为您使用的浏览器不知道或不关心您的%USERPROFILE%\Local Settings\Application Data\Google\Chrome\User Data\Default\Cookies,它会在其他地方查看是否存在Cookie。例如,在Google Chrome中,格式为SQLite,而对于XP,Cookie存储在{{1}}。

答案 1 :(得分:1)

我现在将解释我想要做的事情。 我有一个html页面,要求一些验证码,然后它将验证码发送到PHP脚本,验证代码设置cookie并重定向到相同的HTML页面。 html页面有一些外部链接的javascript,它在检查cookie值时显示页面的内容并进行一些调整。 我现在正在为此编写代码

包含内容和表单的html文件

  

test_cookies.html

    //some css,javascript and html and then a form
<form method="post" action="http://localhost/javascript%20cookies/test_cookies.php">

验证代码的php文件

  

test_cookies.php

if($_POST['value']=="code")
setcookie("user",1);
if($_POST['value']!="code")
setcookie("user",1,time()-1);
header("Location:http://localhost/javascript%20cookies/test_cookies.html");

现在是带有curl代码的php文件

  

curl_cookies.php

<?php
$ch=curl_init();
$url="http://localhost/javascript%20cookies/test_cookies.php";
$post="value=code";     //here i have hard-coded the pst value for a demo but i could have got this from the user
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$post);
curl_setopt($ch,CURLOPT_HEADER,1);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
$res=curl_exec($ch);
curl_close($ch);
preg_match('/Location: (.*)\s/',$res,$location);
preg_match('/Set-Cookie: (.*)\s/',$res,$cookie);
$cookie=rtrim($cookie[0])."; path=/ ";         //path needed to be changed because curl_cookies.php and test_cookies.html are in different directories. 
header($cookie);
header($location[0]);
?>

这终于奏效了,浏览器正在显示调整后的内容。这个东西教会了我很多关于http的内容。 感谢所有在我黑暗中帮助过我的人。