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 je ne suis intéressé que par l'url finale (dans le premier cas http://www.google.com).
Y a-t-il un moyen de le faire en utilisant uniquement les outils de construction linux? (ligne de commande uniquement)
8 réponses
curl
's -w
option et la sous-variable url_effective
est ce que vous êtes
à la recherche pour.
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 de
Vous pouvez ajouter -I
(c'est aussi une majuscule i
), ce qui fera que la commande ne télécharge aucun "corps", mais elle utilise également la méthode HEAD, ce qui n'est pas ce que la question incluait et risque de changer ce que fait le serveur. Parfois les serveurs ne répondent pas bien à la tête même quand ils répondez bien pour obtenir.
Merci, ça m'a aidé. J'ai fait quelques améliorations et enveloppé cela dans un script d'aide "finalurl":
#!/bin/bash
curl $1 -s -L -I -o /dev/null -w '%{url_effective}'
- - o sortie vers
/dev/null
- - Je ne télécharge pas réellement, il suffit de découvrir l'URL finale
- - s mode silencieux, pas de barres de progression
Cela a permis d'appeler la commande à partir d'Autres scripts comme ceci:
echo `finalurl http://someurl/`
, Vous pouvez le faire avec wget habituellement. wget --content-disposition
" url " en outre, si vous ajoutez -O /dev/null
vous ne serez pas réellement enregistrer le fichier.
wget -O /dev/null --content-disposition example.com
Comme une 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.
Merci. 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 ne redirige pas, mais c'est assez bon pour moi car cela fonctionne sur des redirections consécutives.
Pourrait être bogué, mais en un coup d'œil, cela fonctionne bien.
Je ne sais pas comment le 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
Cela fonctionnerait:
curl -I somesite.com | perl -n -e '/^Location: (.*)$/ && print "$1\n"'
Vous pouvez utiliser grep. wget ne vous dit pas où il redirige aussi? Juste grep que dehors.