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)

69
demandé sur Daniel Stenberg 2010-06-19 08:05:02

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.

123
répondu Daniel Stenberg 2018-04-24 14:27:25

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/`
19
répondu Jan Koriťák 2017-07-06 12:07:15

, 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

6
répondu Ceagle 2014-02-20 15:55:30

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.

5
répondu Gavin Mogan 2010-06-19 04:15:36

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.

3
répondu vise 2010-06-19 05:07:31

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
2
répondu Gavin Mogan 2010-06-19 04:11:43

Cela fonctionnerait:

 curl -I somesite.com | perl -n -e '/^Location: (.*)$/ && print "$1\n"'
0
répondu Mike Q 2017-06-12 18:14:08

Vous pouvez utiliser grep. wget ne vous dit pas où il redirige aussi? Juste grep que dehors.

-2
répondu SpliFF 2010-06-19 04:09:21