2011-05-15 165 views
2

我想通过cURL在PHP中设置cookie,但它失败。我的PHP代码如下所示通过卷曲设置cookie

$ch=curl_init(); 
$url="http://localhost/javascript%20cookies/test_cookies.html"; 
curl_setopt($ch, CURLOPT_COOKIE, 'user=1'); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
$contents = curl_exec($ch); 
curl_close($ch); 
echo $contents; 
?> 

文件test_cookies.html包含的JavaScript来检查一个cookie,如果它发现它dispalys额外的用户内容的内容。 但是当我使用上面的脚本时,它显示了页面test_cookies.html的内容,但没有附加的用户内容,这意味着它没有设置cookie。

我试着写另一个剧本这样

<?php 
header("Set-Cookie:user=1"); 
header("Location:test_cookies.html"); 
?> 

这个工作并设置cookie,并给出了额外的用户的内容了。 我使用

curl_setopt($ch,CURLOPT_COOKIEFILE,"cookie.txt"); 
curl_setopt($ch,CURLOPT_COOKIEJAR,"cookie.txt"); 

这是写入cookie信息的文件,但抓取的网页时,不读书也试过。 有人可以帮忙吗?

回答

2

由于JavaScript在浏览器中进行检查,因此您应该在将输出发送到浏览器之前设置cookie。所以,你需要两个脚本结合:

$ch=curl_init(); 
$url="http://localhost/javascript%20cookies/test_cookies.html"; 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
$contents = curl_exec($ch); 
curl_close($ch); 
header("Set-Cookie:user=1"); 
echo $contents; 

说明:
请注意,我们正在寻找两个转变这里:

  1. 数据由卷曲取出,然后
  2. 它被送到到浏览器。

这是一个特殊情况,您使用curl从localhost获取内容,但在现实生活中,您将使用curl从第三个主机获取内容。

如果根据请求中是否发送了cookie,您收到的内容不同,那么您应该使用curl设置cookie。在大多数情况下,您可以将内容无需额外调整即可发送到浏览器。但在这里,您在浏览器中检查cookie 做出决定,因此您不需要第一个cookie设置,而您确实需要第二个。

+0

,但发送一个cookie通知头意味着我不需要设置CURLOPT_COOKIE选项。对我来说似乎不好。 – lovesh 2011-05-15 08:38:18

+0

我意识到由curl获取的内容并不取决于是否存在cookie,我更新了我的答案,因此,在通过curl获取html页面时不需要cookie,但在内容到达时您确实需要cookie在浏览器中。这就是以上所做的。我会把感受放在一边并做一个测试。 – 2011-05-15 08:46:20

+0

@Majid Fouladpour:但这种方式我不使用卷曲来设置cookie,而是依靠标题。如果我需要使用卷曲怎么办?我使用了像CURLOPT_COOKIEFILE和CURLOPT_COOKIEJAR这样的选项,但他不工作。有没有其他出路? – lovesh 2011-05-15 08:50:36

1

JavaScript不能通过从curl获取页面来工作。

+0

那么如果我不使用JavaScript,我的html页面如何检查cookie? – lovesh 2011-05-15 08:14:20

+0

在PHP中,查看$ _COOKIE。您的服务器端代码也可以与Cookie进行交互,而不仅仅是JavaScript。 – 2011-05-15 08:20:38

+0

Nowise,只有当你有php页面并且通过$ _COOKIES – Danzan 2011-05-15 08:21:51