web-dev-qa-db-fra.com

Obtenir l'URL après la redirection de curl

J'ai besoin d'obtenir l'URL finale après une redirection de page de préférence avec curl ou wget.

Par exemple, http://google.com peut rediriger vers http://www.google.com.

Le contenu est facile à obtenir (ex. curl --max-redirs 10 http://google.com -L), mais l’URL finale ne m’intéresse (dans le cas précédent http://www.google.com ).

Est-il possible de le faire en utilisant uniquement les outils de compilation de linux? (ligne de commande uniquement)

75
vise

L'option -w de curl et la sous-variable url_effective correspondent à ce que vous recherchez

Quelque chose comme

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

Plus d'informations

- L Suivre les redirections 
- s Mode silencieux. Ne rien éditer 
- o FILE Écrire la sortie dans <fichier> au lieu de stdout 
- w FORMAT Quoi éditer après avoir terminé 

Plus

Vous voudrez peut-être ajouter -I (c'est-à-dire une majuscule i), ce qui fera que la commande ne téléchargera aucun "corps", mais utilisera également la méthode HEAD question incluse et risque de changer le rôle du serveur. Parfois, les serveurs ne répondent pas bien à HEAD même s’ils répondent bien à GET.

137
Daniel Stenberg

Merci, cela m'a aidé. J'ai apporté quelques améliorations et l'ai intégré dans un script d'aide "finalurl":

#!/bin/bash
curl $1 -s -L -I -o /dev/null -w '%{url_effective}'
  • -o sortie en /dev/null
  • -Je ne télécharge pas réellement, juste découvrir l'URL finale
  • -s mode silencieux, pas de barre de progression

Cela a permis d'appeler la commande à partir d'autres scripts tels que:

echo `finalurl http://someurl/`
20
Jan Koriťák

Vous pouvez le faire avec wget habituellement. wget --content-disposition "url" et si vous ajoutez -O /dev/null, vous ne sauvegarderez pas réellement le fichier. 

wget -O /dev/null --content-disposition example.com

6
Ceagle

comme autre option:

$ curl -i http://google.com
HTTP/1.1 301 Moved Permanently
Location: http://www.google.com/
Content-Type: text/html; charset=UTF-8
Date: Sat, 19 Jun 2010 04:15:10 GMT
Expires: Mon, 19 Jul 2010 04:15:10 GMT
Cache-Control: public, max-age=2592000
Server: gws
Content-Length: 219
X-XSS-Protection: 1; mode=block

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>

Mais ça ne dépasse pas le premier.

5
Gavin Mogan

Je vous remercie. J'ai fini par mettre en œuvre vos suggestions: curl -i + grep

curl -i http://google.com -L | egrep -A 10 '301 Moved Permanently|302 Found' | grep 'Location' | awk -F': ' '{print $2}' | tail -1

Renvoie vide si le site Web ne redirige pas, mais c'est assez bien pour moi car cela fonctionne sur des redirections consécutives.

Peut-être un buggy, mais en un coup d'œil ça fonctionne bien.

3
vise

Je ne sais pas comment faire avec curl, mais libwww-Perl installe l'alias GET.

$ GET -S -d -e http://google.com
GET http://google.com --> 301 Moved Permanently
GET http://www.google.com/ --> 302 Found
GET http://www.google.ca/ --> 200 OK
Cache-Control: private, max-age=0
Connection: close
Date: Sat, 19 Jun 2010 04:11:01 GMT
Server: gws
Content-Type: text/html; charset=ISO-8859-1
Expires: -1
Client-Date: Sat, 19 Jun 2010 04:11:01 GMT
Client-Peer: 74.125.155.105:80
Client-Response-Num: 1
Set-Cookie: PREF=ID=a1925ca9f8af11b9:TM=1276920661:LM=1276920661:S=ULFrHqOiFDDzDVFB; expires=Mon, 18-Jun-2012 04:11:01 GMT; path=/; domain=.google.ca
Title: Google
X-XSS-Protection: 1; mode=block
2
Gavin Mogan

Les paramètres -L (--location) et -I (--head) continuent à faire des requêtes HEAD inutiles à l'adresse URL.

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

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

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

Test de rapidité

all_videos_link.txt - 50 liens de goo.gl + bit.ly qui redirigent vers youtube

1. Avec suivre l'emplacement

time while read -r line; do
    curl -kIsL -w "%{url_effective}\n" -o /dev/null  $line
done < all_videos_link.txt

Résultats:

real    1m40.832s
user    0m9.266s
sys     0m15.375s

2. Sans suivre l'emplacement

time while read -r line; do
    curl -kIs -w "%{redirect_url}\n" -o /dev/null  $line
done < all_videos_link.txt

Résultats:

real    0m51.037s
user    0m5.297s
sys     0m8.094s
0
Geograph

Cela fonctionnerait:

 curl -I somesite.com | Perl -n -e '/^Location: (.*)$/ && print "$1\n"'
0
Mike Q