4 Stimmen

Endziel einer verkürzten URL in PHP bestimmen?

Wie kann ich das in PHP machen? z.B.

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

In Java lautet die Lösung wie folgt:

Sie sollten eine HEAD-Anfrage stellen an die URL mit einer HttpWebRequest Instanz. In der zurückgegebenen HttpWebResponse, überprüfen Sie die ResponseUri.

Stellen Sie einfach sicher, dass die AllowAutoRedirect in der HttpWebRequest-Instanz auf true gesetzt ist Instanz auf true gesetzt ist (standardmäßig ist es true). (Danke, casperOne)

Und der Code lautet

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

(Danke, Fredrik Mork)

Aber ich möchte es in PHP machen. HOWTO? :)

0 Stimmen

Benötigen Sie dies für einen bestimmten Shortener oder sprechen Sie nur allgemein? Viele der "guten" Shortener können Ihnen das endgültige Ziel mitteilen, wenn Sie über die API aufrufen.

1 Stimmen

FYI: Wenn Sie versuchen, die t.co Twitter-URLs umzuleiten, geben sie einen 200-Antwortcode aus, so dass man die <noscript><META http-equiv="refresh" content="0;URL=http://tinyurl.com/7ktoegq"></noscript><scrip‌​t>location.replace("‌​http:\/\/tinyurl.com‌​\/7ktoegq")</script> aus dem Körper.

6voto

Pascal MARTIN Punkte 384469

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

Trotzdem hätte ich mich für etwas wie dieses entschieden:

$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:

  • die angeforderte URL ist die kurze URL
  • Sie wollen die Kopfzeilen nicht
  • Sie wollen sicherstellen, dass der Körper nicht angezeigt wird - wahrscheinlich nutzlos
  • Sie wollen den Body nicht; d.h. Sie wollen eine HEAD-Anfrage und nicht GET
  • Sie wollen natürlich, dass die Standorte verfolgt werden.
  • sobald die Anfrage ausgeführt wurde, möchten Sie die "echte" URL erhalten, die abgerufen wurde

Und hier bekommen Sie :

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

(stammt aus einem der letzten Tweets, die ich gesehen habe und die eine kurze URL enthielten)

Dies sollte mit jedem URL-Verkürzungsdienst funktionieren, unabhängig von dessen spezifischer API.

Möglicherweise möchten Sie auch einige andere Optionen, wie z. B. Timeouts, anpassen; siehe curl_setopt für weitere Informationen.

0 Stimmen

Ich habe ein paar Dinge über die Twitter-Links von t.co ausprobiert, aber das ist das Einzige, was bisher bei mir funktioniert hat. Danke! +1

1voto

Robert French Punkte 658
<?php
$url = 'http://www.example.com';

print_r(get_headers($url));

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

0 Stimmen

Das Parsen des Location-Headers würde wahrscheinlich funktionieren; aber was, wenn es zwei (oder mehr) Ebenen von Weiterleitungen gibt? (ja, nicht das, was man normalerweise sieht, aber was ist, wenn die Zielsite am Tag der Veröffentlichung einer neuen Version der Site einige Umleitungen einrichtet? )

1voto

Gabriel Sosa Punkte 7818

Haben Sie die bit.ly-API gelesen? aquí ?

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

0 Stimmen

Wenn Sie eine spezifische API verwenden, müssen Sie für jeden einzelnen URL-Verkürzungsdienst einen neuen spezifischen Code erstellen; da es eine ganze Menge davon gibt, werden Sie nie aufhören zu kodieren und zu testen... eine "generische" Lösung, die mit jedem Dienst funktioniert, wäre wahrscheinlich einfacher, zumindest als langfristige Lösung...

0voto

Zack Burt Punkte 7768

ANRECHNUNG 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"];

0voto

Dong3000 Punkte 566

Hier ist meine Lösung. Ich habe sie codiert, weil keine der oben genannten Lösungen 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;

}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X