отслеживание заголовков страниц и перенаправлений с помощью php-libcurl

#php #cookies #redirect #curl #header

#php #файлы cookie #перенаправление #curl #заголовок

Вопрос:

Я писал скрипт для отслеживания заголовков, особенно перенаправлений и файлов cookie для URL. Много раз, когда я открываю URL, он перенаправляет на другой URL, а иногда и на несколько URL, а также сохраняет некоторые файлы cookie. Но когда я запустил скрипт с url

http://en.wikipedia.org/

мой скрипт не сохранил файлы cookie, и он показал только одно перенаправление и не сохранил никаких файлов cookie. но когда я просматривал URL в Firefox, он сохранял файлы cookie, а когда я проверял его с помощью Live HTTP Headers , он показывал несколько запросов get. Текущие заголовки HTTP также показывают, что существуют заголовки с установленными файлами 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("nnn",$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 затем он показывает перенаправление на google.co.in в location.txt файле и сохраняет cookie в cookie.txt файле. Но когда я открываю google.com в Firefox , сохраняются три файла cookie. Что может быть не так?
Я думаю, что на странице есть некоторый javascript, который устанавливает файлы cookie, поэтому curl не может их получить.
также приветствуются любые предложения по улучшению приведенного выше кода

Ответ №1:

Ваше местоположение: приведенный ниже код полностью не работает, поскольку вы должны были видеть, что большинство HTTP-перенаправлений относительны, и поэтому вы не можете просто использовать эту строку в качестве URL в последующем запросе.

Комментарии:

1. Дэниел Стенберг: я исправил код для относительных URL-адресов, и я думаю, что файл cookie не был установлен, потому что файл cookie устанавливается javascript на html-странице. я исправлю это через несколько дней после сдачи экзаменов. спасибо за помощь