我修改了以前的代码。你可以看到我之前发布的帖子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次调用吗?
答案 0 :(得分:1)
目前尚不清楚您要使用代码实现的目标。如果你解释为什么要这样做,你会得到更好的帮助。您的方法很可能是错误的,您可以通过不同/更简单的方法获得最终结果。
现在回答你的问题,这就是:
curl.php
发送GET请求(我用于您的第一个文件的名称),cookie.txt
并找到user=1
,因此它向test_cookies.php
发送GET请求并发送带有请求的Cookie test_cookies.php
发现user=1
为真,因此会向curl.php
发送标题,并要求其设置两个Cookie:user=1
和color=blue
(对于CURLOPT_COOKIEJAR
第一个cookie是没有意义的,user = 1已经设置好,但是让我们忽略它,因为没有造成任何伤害)curl.php
选项,因此当test_cookies.php
收到设置的Cookie标头时,它不会给出该死的(没有任何反应)curl.php
向CURLOPT_FOLLOWLOCATION,1
发送重定向标头,因为您设置了curl.php
,test_cookies.html
发送了另一个GET请求,这次是test_cookies.html
curl.php
的内容将返回curl_exec($ch);
,test_cookies.html
会将返回的内容(user
的来源)回显给您的浏览器,curl_setopt($ch,CURLOPT_COOKIEJAR,dirname(__FILE__) . "/cookie.txt");
的cookie并且找不到cookie,因此它显示没有cookie时的内容(因为没有cookie)。现在,您可能想知道如果添加以下内容会发生什么:
cookie.txt
您的user=1
将在步骤4中更新,并且会有两个Cookie,会发生什么? color=blue
和header("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的内容。 感谢所有在我黑暗中帮助过我的人。