192 votes

Obtenir l'URL finale 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 je ne m'intéresse qu'à l'url finale (dans le premier cas http://www.google.com ).

Existe-t-il un moyen d'y parvenir en utilisant uniquement les outils intégrés à Linux ? (ligne de commande uniquement)

342voto

Daniel Stenberg Points 9116

curl 's -w option et la sous-variable url_effective est ce que vous êtes ce que vous recherchez.

Quelque chose comme

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

Plus d'informations

\-L         Follow redirects
-s         Silent mode. Don't output anything
-o FILE    Write output to <file> instead of stdout
-w FORMAT  What to output after completion

Plus d'informations

Vous pouvez ajouter -I (c'est-à-dire une majuscule i ), ce qui fera que la commande ne téléchargera pas de "corps", mais elle utilisera également la méthode HEAD, ce qui n'est pas ce que la question incluait et risque de modifier ce que fait le serveur. Parfois, les serveurs ne répondent pas bien à HEAD même s'ils répondent bien à GET.

42voto

Jan Koritak Points 446

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

#!/bin/bash
curl $1 -s -L -I -o /dev/null -w '%{url_effective}'
  • -o la sortie vers /dev/null
  • -I ne pas télécharger, mais découvrir l'URL final
  • -s mode silencieux, pas de barre de progression

Cela permet d'appeler la commande à partir d'autres scripts comme ceci :

echo `finalurl http://someurl/`

11voto

halkeye Points 857

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 il ne dépasse pas le premier.

6voto

vise Points 4979

Je vous remercie. J'ai fini par appliquer 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 un blanc si le site web n'est pas redirigé, mais cela me suffit car il fonctionne sur des redirections consécutives.

Il pourrait être bogué, mais à première vue, il fonctionne bien.

6voto

Ceagle Points 114

Vous pouvez le faire avec wget. wget --content-disposition "url" en plus si vous ajoutez -O /dev/null vous n'enregistrerez pas réellement le fichier.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X