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)
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.
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}'
/dev/null
Cela a permis d'appeler la commande à partir d'autres scripts tels que:
echo `finalurl http://someurl/`
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
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.
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.
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
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"
all_videos_link.txt
- 50 liens de goo.gl + bit.ly qui redirigent vers youtube
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
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
Cela fonctionnerait:
curl -I somesite.com | Perl -n -e '/^Location: (.*)$/ && print "$1\n"'