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?

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 ...

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

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

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

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"
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.