2010-06-19 7 views
63

Je dois obtenir l'URL final après une redirection de page de préférence avec curl ou wget.Obtenir l'URL après curl est redirigé

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

Le contenu est facile à obtenir (par exemple curl --max-redirs 10 http://google.com -L), mais je suis seulement intéressé par l'URL final (dans le premier cas http://www.google.com).

Y a-t-il un moyen de le faire en utilisant uniquement des outils linux buildin? (ligne de commande uniquement)

Répondre

93

curl option et la sous-variable url_effective est ce que vous recherchez .

Quelque chose comme

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

Plus d'info

 
-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

Vous pouvez ajouter -I (qui est une majuscule 'i') et, qui fera la commande ne télécharge pas de "corps", mais utilise aussi la méthode HEAD, ce qui n'est pas la question incluse et risque de changer ce que fait le serveur. Parfois, les serveurs ne répondent pas bien à HEAD même s'ils répondent bien à GET.

+4

vous devriez être en mesure d'utiliser "-o/dev/null" si vous ne voulez pas le fichier –

+0

C'est une excellente option, je ne savais pas Curl pourrait le faire! Il ne cesse de me surprendre :-) '' – Josh

+1

qui est plus d'une fonction de coque que boucle – user151841

-2

Vous pouvez utiliser grep. ne pas wget vous dire où il redirige aussi? Juste grep ça.

2

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 
4

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 va pas au-delà de la première.

3

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 

Retours vide si le site ne redirige pas, mais c'est assez bon pour moi que cela fonctionne sur redirections consécutifs.

Peut-être bogué, mais en un coup d'œil cela fonctionne bien.

18

Merci, ça m'a aidé.J'ai fait quelques améliorations et enveloppées que dans un script d'aide "finalurl":

#!/bin/bash 
curl $1 -s -L -I -o /dev/null -w '%{url_effective}' 
  • sortie -o à /dev/null
  • -Je ne télécharge pas, découvrez simplement l'URL finale
  • -s mode silencieux, pas ProgressBars

Ceci a permis d'appeler la commande à partir d'autres scripts comme ceci:

echo `finalurl http://someurl/` 
+1

Merci pour ces idées Je réécrite pour un usage terminal dans mon fichier .bashrc en fonction, et il n'y a pas besoin pour les options laconiques dans ce fichier, alors j'ai utilisé les noms longs à l'auto-documents ceci: 'finalurl() {gondoler --silent - location --head --output/dev/null --effet d'écriture '% {url_effective}' - "$ @"; } ' – buggy3

5

Vous pouvez le faire avec wget habituellement. wget --content-disposition "url" En outre, si vous ajoutez -O /dev/null vous ne serez pas en train d'enregistrer le fichier.

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

0

Cela fonctionnerait:

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