2009-08-23 12 views
4

Wie kann ich das in PHP tun? z.B.Finales Ziel einer verkürzten URL in PHP bestimmen?

bit.ly/f00b4r ==>http://www.google.com/search?q=cute+kittens

In Java ist die Lösung dieses:

Sie sollten eine HEAD-Anfrage zu erteilen die URL eine HttpWebRequest Instanz verwenden. Überprüfen Sie in der zurückgegebenen HttpWebResponse die ResponseUri.

Sie sicher, machen die AllowAutoRedirect auf true auf der HttpWebRequest Instanz gesetzt ist (es ist wahr, Standardeinstellung). (Thx, casperOne)

Und der Code ist

private static string GetRealUrl(string url) 
{ 
    WebRequest request = WebRequest.Create(url); 
    request.Method = WebRequestMethods.Http.Head; 
    WebResponse response = request.GetResponse(); 
    return response.ResponseUri.ToString(); 
} 

(Thx, Fredrik Mork)

Aber ich will es in PHP tun. WIE MAN? :)

+0

benötigen Sie dies für einen bestimmten Verkürzer? oder du redest nur allgemein? viele der "guten" Verkürzer können Ihnen das endgültige Ziel bieten, wenn Sie über API anrufen –

+1

FYI: Wenn Sie versuchen, http://t.co twitter urls umzuleiten, geben sie einen 200-Response-Code, so dass Sie greifen müssen ' 'aus dem Körper. – Philip

Antwort

0

Kredit geht an http://forums.devshed.com/php-development-5/curl-get-final-url-after-inital-url-redirects-544144.html

function get_web_page($url) 
{ 
    $options = array( 
     CURLOPT_RETURNTRANSFER => true,  // return web page 
     CURLOPT_HEADER   => true, // 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; 
} 
$thisurl = "http://www.example.com/redirectfrom"; 
$myUrlInfo = get_web_page($thisurl); 
echo $myUrlInfo["url"]; 
1
<?php 
$url = 'http://www.example.com'; 

print_r(get_headers($url)); 

print_r(get_headers($url, 1)); 
?> 
+0

Parsing der Location-Header würde wahrscheinlich funktionieren; aber was ist, wenn es (oder mehr) Ebenen von Umleitungen gibt? (Ja, nicht das, was Sie normalerweise sehen, aber was passiert, wenn die Zielseite am Tag der Veröffentlichung einer neuen Version der Website Umleitungen einrichtet?) –

1

Haben Sie den bit.ly API lesen? speziell here?

Ich kann das Problem nicht sehen. Sprechen Sie über mögliche Weiterleitungen?

+0

Wenn Sie eine bestimmte API verwenden, müssen Sie einen neuen spezifischen Code für jedes distinct erstellen Verkürzung-URL-Dienst; Wenn man bedenkt, dass es einige davon gibt, hört man nie auf zu programmieren und zu testen ... einige "generische" Lösungen, die mit jedem Service funktionieren, wären wahrscheinlich einfacher, zumindest als langfristige Lösung ... –

+0

richtig! Deshalb habe ich gefragt: P –

5

Die Zeit zu versuchen, Sie haben bereits die Antwort gefunden.

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, "http://bit.ly/tqdUj"); 
curl_setopt($ch, CURLOPT_HEADER, false); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_NOBODY, true); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_exec($ch); 

$url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL); 

curl_close($ch); 

var_dump($url); 

Einige Erklärungen:

Dennoch hätte ich mit so etwas wie das gegangen

  • die angeforderte URL ist die kurze
  • Sie wollen nicht die Header
  • möchten Sie sicherstellen, dass der Körper nicht angezeigt wird - wahrscheinlich nutzlos
  • du willst den Körper nicht; dh, möchten Sie eine HEAD-Anfrage, und GET nicht
  • Sie Standorten wollen folgen, natürlich
  • , sobald die Anforderung ausgeführt wurde, können Sie die „echte“ URL erhalten möchten, die
abgerufen wurde

Und hier erhalten Sie:

string 'http://wordpress.org/extend/plugins/wp-pubsubhubbub/' (length=52) 

(Kommt aus einer der letzten Tweets sah ich, dass eine kurze URL enthalten)


Dies sollte mit jedem verkürzten URL-Dienst funktionieren, unabhängig von ihrer spezifischen API.

Sie können auch einige andere Optionen wie Timeouts optimieren; Weitere Informationen finden Sie unter curl_setopt.

+0

Ich habe ein paar Dinge auf t.co Twitter-Links versucht und das ist das einzige, was bisher für mich funktioniert hat. Vielen Dank! +1 –

0

Hier ist meine Lösung. Ich habe es codiert, weil nichts von dem oben genannten richtig funktioniert hat.

function get_final_location($url, $index=null) { 

    if (is_array($url)) { 
     $headers = $url; 
    } 
    else { 
     $headers = get_headers($url, 1)['Location'];  
     if (count($headers) == 0) { 
      return $url; 
     } 
    } 

    if (is_null($index)) { 
     $to_check = end($headers); 
     $index  = count($headers) - 1; 
    } 
    else { 
     $to_check = $headers[$index]; 
    } 

    if (!filter_var($to_check, FILTER_VALIDATE_URL) === false) { 
     if (count($headers) - 1 > $index) { 
      $lp = parse_url($headers[$index], PHP_URL_SCHEME) . "://" . parse_url($headers[$index], PHP_URL_HOST) . $headers[$index+1]; 
     } 
     else { 
      $lp = $to_check; 
     } 
    } 
    else { 
     $index--; 
     $lp = landingpage($headers, $index); 
    } 

    return $lp; 

}