Ottieni il target di reindirizzamento dell'URL con l'arricciatura


24

Vorrei verificare dove viene reindirizzato un singolo URL. Un esempio potrebbe essere un collegamento dalla pagina dei risultati di ricerca di Google (in cui un clic passa sempre attraverso il server di Google).

Posso farlo con curl?

Risposte:


18

Prova questo:

$ LOCATION=`curl -I http://raspberrypi.stackexchange.com/a/1521/86 | perl -n -e '/^Location: (.*)$/ && print "$1\n"'`
$ echo "$LOCATION"
/questions/1508/how-do-i-access-the-distributions-name-on-the-command-line/1521#1521

Reindirizzamenti di Google

Gli URL di reindirizzamento di Google sono leggermente diversi. Restituiscono un reindirizzamento Javascript, che potrebbe essere facilmente elaborato, ma perché non elaborare l'URL originale e per andare tutti insieme?

$ URL="http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CFAQFjAA&url=http%3A%2F%2Fwww.raspberrypi.org%2F&ei=rv8oUODIIMvKswa4xoHQAg&usg=AFQjCNEBMoebclm0Gk0LCZIStJbF04U1cQ"
$ LOCATION=`echo "$URL" | perl -n -e '/url=([a-zA-Z0-9%\.]*)/ && print "$1\n"'`
$ echo "$LOCATION"
http%3A%2F%2Fwww.raspberrypi.org%2F
$ echo "$LOCATION" | perl -pe 's/%([0-9a-f]{2})/sprintf("%s", pack("H2",$1))/eig'
http://www.raspberrypi.org/

Riferimento

  1. Per la decodifica dell'URL ...

Che ne dici di URL speciali con caratteri speciali (come i reindirizzamenti di Google), ad esempio: google.com/…
syntagma

@REACHUS Il reindirizzamento è codificato nella stringa di query dell'URL fornito.
Alex Chamberlain,

@REACHUS Nessun problema: probabilmente puoi combinare le 2 istruzioni perl.
Alex Chamberlain,

20

C'è un modo ancora più semplice

curl -w "%{url_effective}\n" -I -L -s -S $URL -o /dev/null

sarebbe stampato

http://raspberrypi.stackexchange.com/questions/1508/how-do-i-access-the-distributions-name-on-the-command-line/1521

per URL

http://raspberrypi.stackexchange.com/a/1521/86

3
Questo però richiede più tempo e larghezza di banda, poiché stai scaricando anche la seconda pagina.
unhammer,

1
@unhammer Hai ragione, ho aggiornato la mia risposta per fare solo richieste di testa.
Ismail,

7

l'arricciatura può essere configurata per seguire i reindirizzamenti e stampare le variabili dopo il completamento. Quindi ciò che chiedi può essere raggiunto con il seguente comando:

curl -Ls -w %{url_effective} -o /dev/null https://google.com

La pagina man spiega i parametri necessari in questo modo:

-L, --location          Follow redirects (H)
-s, --silent            Silent mode (don't output anything)
-w, --write-out FORMAT  Use output FORMAT after completion
-o, --output FILE       Write to FILE instead of stdout

4

o prova questo

curl -s -o /dev/null -I -w "HTTP_CODE: %{http_code}\nREDIRECT_URL: %{redirect_url}\n" http://raspberrypi.stackexchange.com/a/1521/86

Che ne dici di URL speciali con caratteri speciali (come i reindirizzamenti di Google), ad esempio: google.com/…
syntagma

inserisci l'URL tra virgolette singole, in modo che la tua shell ignori i caratteri speciali nel link. Ma il link che hai indicato non reindirizza a un altro uri, il codice di stato della risposta è 200 e non 3xx. L'uri che cerchi è nascosto rispettivamente nell'uri stesso nel contenuto della risposta. Per un ulteriore esame puoi studiare l'intestazione della risposta con curl -s -I 'http://yoururl'e il contenuto della risposta con curl -s 'http://yoururl'(vedrai che google usa un semplice javascript per il reindirizzamento).
user1146332

0

I parametri -L (--location)e -I (--head)ancora facendo la richiesta HEAD non necessaria all'URL di posizione.

Se sei sicuro di non avere più di un reindirizzamento, è meglio disabilitare follow location e utilizzare una variabile di arricciatura% {redirect_url}.

Questo codice esegue solo una richiesta HEAD all'URL specificato e accetta redirect_url dall'intestazione della posizione:

curl --head --silent --write-out "%{redirect_url}\n" --output /dev/null "https://goo.gl/QeJeQ4"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.