WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Untiny, eller hur får man reda på den riktiga URLen. (https://www.wn.se/forum/showthread.php?t=1040029)

grinditwp 2010-01-15 11:01

Untiny, eller hur får man reda på den riktiga URLen.
 
Många tjänster så som Twitter använder Tinyurl och liknande tjänster för att skapa kort adresser. Men kan jag via PHP få reda på den riktiga URLen om jag har en kortadress?

Exempelvis http://tiny.pl/htk går till http://www.google.com

En tjänst som gör detta är exempelvis: http://www.untiny.com/ men vill helst inte bli beroende av deras API.

allstars 2010-01-15 11:09

htk i http://tiny.pl/htk refererar väl till en rad i en databas, antar jag så det går inte att "räkna ut" med hjälp av php på din egen server.

edit: jag tänkte nog inte tillräckligt länge innan mitt svar :P

du vill alltså ha en egen funktion som gör samma som untinys api?

grinditwp 2010-01-15 11:22

Citat:

Ursprungligen postat av allstars (Inlägg 20339183)
htk i http://tiny.pl/htk refererar väl till en rad i en databas, antar jag så det går inte att "räkna ut" med hjälp av php på din egen server.

edit: jag tänkte nog inte tillräckligt länge innan mitt svar :P

du vill alltså ha en egen funktion som gör samma som untinys api?

Precis... men jag lyckades :) Det var lättare än jag trodde.
Här är källkod om någon vill ha:

PHP-kod:

function unTiny($url){
    
$success false;
        
//Hämta och följ eventuell Location
    
do {
        
$header['Location'] = '';
        
$header get_headers($url1);
        if(
$header['Location'] != ''){
            
$url $header['Location'];
            
$success true;
        }
    } while(
$header['Location'] != '');
    
    if(!
$success){
                
//Hittade vi ingen Location testa location
        
do {
        
$header['location'] = '';
        
$header get_headers($url1);
        if(
$header['location'] != ''){
            
$url $header['location'];
            
$success true;
        }
        } while(
$header['location'] != '');
    }
    return 
$url;
}
echo 
unTiny('http://tiny.pl/htk'); //Skriver ut http://www.google.com 


BjörnJ 2010-01-15 11:23

Man får väl göra en http-request och titta i svaret vilken URL redirect sker till. Eventuellt spara det i en egen databas om man inte vill göra samma request flera gånger. (Om det nu är tillåtet att göra så?)

BjörnJ 2010-01-15 11:35

Citat:

Ursprungligen postat av grinditwp (Inlägg 20339186)
Precis... men jag lyckades :) Det var lättare än jag trodde.
Här är källkod om någon vill ha:

Varför do ... while? Det är väl ingen vits att loopa där.

Och varför köra get_headers() en gång extra om den inte lyckades första gången? $header är ju redan satt och innehållet i den kommer inte bli annorlunda bara för att man kör get_headers() igen.

BjörnJ 2010-01-15 11:40

Jag ändrade koden lite (har dock inte testat den):
PHP-kod:

function unTiny($url){
    
$header get_headers($url1);
    if(isset(
$header['Location']))
        return 
$header['Location'];
    if(isset(
$header['location']))
        return 
$header['location'];
    return 
false;
}
echo 
unTiny('http://tiny.pl/htk'); //Skriver ut http://www.google.com 


emilv 2010-01-15 11:56

Citat:

Ursprungligen postat av BjörnJ (Inlägg 20339188)
Varför do ... while? Det är väl ingen vits att loopa där.

Jo, om man vill få reda på den verkliga slutdestinationen. Det är ju tillåtet att köra redirects i flera led.

grinditwp 2010-01-15 15:20

Citat:

Ursprungligen postat av emilv (Inlägg 20339191)
Jo, om man vill få reda på den verkliga slutdestinationen. Det är ju tillåtet att köra redirects i flera led.

Precis. Ibland kan det finnas mer än en redirect.
Visst, majoriteten av alla Tinyurls har antagligen bara en redirect.

Är dock inte säker på hur alla andra liknande tjänster fungerar.

Hur som, det är det enda sättet, jag kan komma på, att vara helt säker på att det är slutdestinationen.

BjörnJ 2010-01-15 18:44

Citat:

Ursprungligen postat av emilv (Inlägg 20339191)
Jo, om man vill få reda på den verkliga slutdestinationen. Det är ju tillåtet att köra redirects i flera led.

Jo, det är sant, men då handlar det ju inte riktigt om untiny längre. Svaret man får fram skulle till och med kunna ses som felaktigt om det har skett ytterligare redirects, beroende på vad man är ute efter.

Om man ska använda det rent informativt är det väl bättre att skriva ut alla steg.

PHP-kod:

// unTiny() avser funktionen i mitt föregående inlägg.
// kanske borde döpas om till chkRedir() eller liknande.
echo $url;
while(
$url=unTiny($url))
  echo 
' -> '.$url


studiox 2010-01-17 14:20

Citat:

Ursprungligen postat av grinditwp (Inlägg 20339216)
Precis. Ibland kan det finnas mer än en redirect.
Visst, majoriteten av alla Tinyurls har antagligen bara en redirect.

Är dock inte säker på hur alla andra liknande tjänster fungerar.

Hur som, det är det enda sättet, jag kan komma på, att vara helt säker på att det är slutdestinationen.

Kör Curl istället. Den kan följa redirects och du får alltid reda på destinationen

Notera att destinationen kan vara en helt annan än vad som finns i TinyURL. Exempelvis så skapar jag en TinyURL till https://www.google.se men den adressen finns inte, så google gör själva en redirect till http://www.google.se (dvs. utan HTTPS)


Alla tider är GMT +2. Klockan är nu 17:23.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson