Obtenez la cible de redirection de l'URL avec curl

24

Je voudrais vérifier où une URL unique redirige. Un exemple de cela pourrait être un lien de la page de résultats de recherche de Google (où un clic passe toujours par le serveur Google).

Puis-je faire ça avec curl?

syntagme
la source

Réponses:

18

Essaye ça:

$ 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

Redirige Google

Les URL de redirection Google sont légèrement différentes. Ils renvoient une redirection Javascript, qui pourrait facilement être traitée, mais pourquoi ne pas traiter l'URL d'origine et pour aller boucler tous ensemble?

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

Référence

  1. Pour décoder l'URL ...
Alex Chamberlain
la source
Que diriez-vous des URL spéciales avec des caractères spéciaux (comme les redirections de Google), par exemple: google.com/…
syntagma
@REACHUS La redirection est encodée dans la chaîne de requête de l'URL donnée.
Alex Chamberlain
@REACHUS Pas de soucis - vous pouvez probablement combiner les 2 instructions perl.
Alex Chamberlain
20

Il existe un moyen encore plus simple

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

il imprimerait

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

pour l'URL

http://raspberrypi.stackexchange.com/a/1521/86
ismail
la source
3
Cela utilise cependant plus de temps et de bande passante, car vous téléchargez également la deuxième page.
unhammer
1
@unhammer Vous avez raison, j'ai mis à jour ma réponse pour ne faire que des requêtes de tête.
ismail
7

curl peut être configuré pour suivre les redirections et imprimer les variables après la fin. Donc, ce que vous demandez peut être réalisé avec la commande suivante:

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

La page de manuel explique les paramètres nécessaires comme ça:

-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
schmijos
la source
4

ou essayez ceci

curl -s -o /dev/null -I -w "HTTP_CODE: %{http_code}\nREDIRECT_URL: %{redirect_url}\n" http://raspberrypi.stackexchange.com/a/1521/86
user1146332
la source
Que diriez-vous des URL spéciales avec des caractères spéciaux (comme les redirections de Google), par exemple: google.com/…
syntagma
mettez simplement l'url entre guillemets simples, de sorte que votre shell ignore les caractères spéciaux du lien. Mais le lien que vous avez indiqué ne redirige pas vers un autre uri, le code d'état de la réponse est 200 et non 3xx. L'URI que vous recherchez est caché dans l'URI lui-même respectivement dans le contenu de la réponse. Pour un examen plus approfondi, vous pouvez étudier l'en-tête de la réponse avec curl -s -I 'http://yoururl'et le contenu de la réponse avec curl -s 'http://yoururl'(vous verrez que Google utilise un simple javascript pour la redirection).
user1146332
0

Les paramètres -L (--location)et -I (--head)toujours faire HEAD-demande inutile à l'emplacement-url.

Si vous êtes sûr de ne pas avoir plus d'une redirection, il est préférable de désactiver la localisation de suivi et d'utiliser une variable curl% {redirect_url}.

Ce code ne fait qu'une seule requête HEAD à l'URL spécifiée et prend redirect_url de location-header:

curl --head --silent --write-out "%{redirect_url}\n" --output /dev/null "https://goo.gl/QeJeQ4"
Géographie
la source