我正在编写一个脚本来跟踪标头,尤其是URL的重定向和cookie。很多时候,当我打开一个网址时,它会重定向到另一个网址,有时甚至是多个网址,并且还存储了一些cookie。但是当我使用 url 运行脚本时
http://en.wikipedia.org/
我的脚本没有保存 cookie,它只显示一个重定向并且没有存储任何 cookie。 但是当我在 Firefox 中浏览 URL 时,它保存了 cookie,当我用 Live HTTP Headers
检查它时,它显示了多个 get 请求。Live HTTP 标头还显示存在 Set-Cookie 标头。
<?php
$url="http://en.wikipedia.org/";
$userAgent="Mozilla/5.0 (Windows NT 5.1; rv:2.0)Gecko/20100101 Firefox/4.0";
$accept="text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
$encoding="gzip, deflate";
$header['lang']="en-us,en;q=0.5";
$header['charset']="ISO-8859-1,utf-8;q=0.7,*;q=0.7";
$header['conn']="keep-alive";
$header['keep-alive']=115;
$i=1;
$flag=1; //0 if there is no redirect i.e. no location header to follow. used here to to control the while loop below
while($flag!=0) {
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_USERAGENT,$userAgent);
curl_setopt($ch,CURLOPT_ENCODING,$encoding);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,0);
curl_setopt($ch,CURLOPT_HEADER,1);
curl_setopt($ch,CURLOPT_NOBODY,1);
curl_setopt($ch,CURLOPT_AUTOREFERER,true);
curl_setopt($ch, CURLOPT_COOKIEJAR, dirname(__FILE__) . "/cookie.txt");
curl_setopt($ch, CURLOPT_COOKIEFILE, dirname(__FILE__) . "/cookie.txt");
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
$pageHeader[$i]=curl_exec($ch);
curl_close($ch);
$flag=preg_match('/Location: (.*)'s/',$pageHeader[$i],$location[$i]);
if($flag==1) { //if there is a location header
if(preg_match('@^(http://|www.)@',$location[$i][1],$tempurl)==1) { //if it is an absolute url
$url=$location[$i][1];
} else {
if(preg_match('@^/(.*)@',$location[$i][1],$tempurl)==1) { //if the url corresponds to url relative to server's root
preg_match('@^((http://)|(www.))[^/]+@',$url,$domain);
$url=$domain.$tempurl[0];
} else { //if the url is relative to current directory
$url=preg_replace('@(/[^/]+)$@',"/".$location[$i][1],$url);
}
}
$location[$i]=$url;
preg_match('/Set-Cookie: (.*)'s/',$pageHeader[$i],$cookie[$i]);
$i++;
}
foreach($location as $l)
$loc=$loc.$l."'n";
$header=implode("'n'n'n",$pageHeader);
file_put_contents(dirname(__FILE__) . "/location.txt",$loc);
file_put_contents(dirname(__FILE__) . "/header.txt",$header);
?>
此处创建了文件location.txt
和header.txt
,但不创建cookie.txt
。如果我将 URL 更改为 google.com,那么它会显示重定向到 location.txt
文件中的google.co.in
,并在cookie.txt
文件中保存一个 cookie。但是当我在Firefox
中打开google.com
时,它会保存三个饼干。可能出了什么问题?我认为页面上有一些 javascript 正在设置 cookie,因此 curl 无法获得它。也欢迎对上述代码的改进提出任何建议
您的位置:以下代码完全损坏,因为您应该已经看到大多数HTTP重定向相对,因此您不能在后续请求中仅将该字符串用作URL。