[PHP] Met curl de laatste url ophalen met of zonder redirect

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
Ik probeer al sinds enige tijd met curl de laatste url van een pagina op te halen met of zonder redirect.

Even een voorbeeld.
Stel ik ga naar http://www.tweakers.net en deze heeft geen redirect dan krijg ik de url http://www.tweakers.net terug.

Stel ik ga naar http://www.tweakers.net en deze heeft een redirect naar http://www.willem.nl dan krijg ik de url http://www.willem.nl terug.

Met
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
function get_web_page( $url ) 
{ 
    $options = array( 
        CURLOPT_RETURNTRANSFER => true,     // return web page 
        CURLOPT_HEADER         => true,    // don't return headers 
        CURLOPT_FOLLOWLOCATION => true,     // follow redirects 
        CURLOPT_ENCODING       => "",       // handle all encodings 
        CURLOPT_USERAGENT      => "spider", // who am i 
        CURLOPT_AUTOREFERER    => true,     // set referer on redirect 
        CURLOPT_CONNECTTIMEOUT => 120,      // timeout on connect 
        CURLOPT_TIMEOUT        => 120,      // timeout on response 
        CURLOPT_MAXREDIRS      => 10,       // stop after 10 redirects 
    ); 

    $ch      = curl_init( $url ); 
    curl_setopt_array( $ch, $options ); 
    $content = curl_exec( $ch ); 
    $err     = curl_errno( $ch ); 
    $errmsg  = curl_error( $ch ); 
    $header  = curl_getinfo( $ch ); 
    curl_close( $ch ); 

    $header['errno']   = $err; 
    $header['errmsg']  = $errmsg; 
    $header['content'] = $content; 
    print($header[0]); 
    return $header; 
}


Krijg ik wel een en aander terug, en in de $header["content"] staat wel de header van die pagina en daar staat wel de url in waar naar geredirect wordt, maar ik vroeg me af of het niet simpeler kan dat ik middels een bepaald soort opties altijd de juiste url terug krijg die ik wil.

Acties:
  • 0 Henk 'm!

  • Noork
  • Registratie: Juni 2001
  • Niet online
In geval van een redirect (301) staat er vaak ook geen content/output op de link die je opent. Ik zie daarom niet in waarom je juist die pagina wilt ophalen?

Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 21:07

TeeDee

CQB 241

Een FollowLocation op true zou voldoende moeten zijn om het probleem te omzeilen.
Je zou hier nog even tussen kunnen neuzelen.

Heart..pumps blood.Has nothing to do with emotion! Bored


Acties:
  • 0 Henk 'm!

  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
Als ik CURLOPT_RETURNTRANSFER => true op false zet, krijg ik helemaal niks terug...

Het gaat mij erom dat ik de laatste url teurg krijg, die pagina hoeft verder niet geopend te worden.

[ Voor 38% gewijzigd door RSD op 27-08-2008 13:42 ]


Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 21:07

TeeDee

CQB 241

Zit er niks anders op om de header uit te lezen en die URL te gebruiken.

Heart..pumps blood.Has nothing to do with emotion! Bored


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Noork schreef op woensdag 27 augustus 2008 @ 13:33:
In geval van een redirect (301) staat er vaak ook geen content/output op de link die je opent. Ik zie daarom niet in waarom je juist die pagina wilt ophalen?
'vaak geen' is misschien wel de praktijk, maar volgens de RFC zou zo'n request wel een respons met een body moeten opleveren ;)

Maar het is inderdaad niet echt nuttig om de hele respons op te halen, een HEAD request is voldoende. Ik doe het ongeveer zo (om bv tinyUrl's om te zetten):

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
function getRealUrl($tinyUrl)
{
    $realUrl = $tinyUrl;

    $ch = curl_init($tinyUrl);

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);

    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);

    curl_setopt($ch, CURLOPT_LOW_SPEED_TIME, 30);
    curl_setopt($ch, CURLOPT_LOW_SPEED_LIMIT, 100);

    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'HEAD');

    $result = curl_exec($ch);

    curl_close($ch);

    if (preg_match('/^Location:(.*)$/mi', $result, $match))
        $realUrl = strtolower(trim($match[1]));

    return $realUrl;
}

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Crisp: zou je die eventueel niet recursief willen? Voor het geval je doorgestuurd wordt na een redirect?

Blog [Stackoverflow] [LinkedIn]


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Wolfboy schreef op woensdag 27 augustus 2008 @ 14:22:
Crisp: zou je die eventueel niet recursief willen? Voor het geval je doorgestuurd wordt na een redirect?
ja, dat kan natuurlijk. Of in een simpel loopje. Dit was puur ter illustratie ;)
(wel zorgen dat je niet in een oneindige loop geraakt natuurlijk :P)

[ Voor 10% gewijzigd door crisp op 27-08-2008 14:25 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Inderdaad, maximaal 5 niveaus diep ofzo. Eventueel zou je (om het aantal verbindingen te beperken) zelfs nog de verbinding open kunnen houden en dus alleen elke keer een request als deze te doen (mits op dezelfde servers)
HTTP:
1
2
HEAD /het_pad HTTP/1.1
Connection: keep-alive
Het is natuurlijk nutteloos om de hele body op te halen voor alleen een redirect controle :)

Blog [Stackoverflow] [LinkedIn]

Pagina: 1