Ottieni l'URL finale dopo il reindirizzamento di curl


111

Devo ottenere l'URL finale dopo il reindirizzamento di una pagina preferibilmente con curl o wget.

Ad esempio, http://google.com può reindirizzare a http://www.google.com .

I contenuti sono facili da ottenere (es. curl --max-redirs 10 http://google.com -L), Ma a me interessa solo l'URL finale (nel primo caso http://www.google.com ).

C'è un modo per farlo utilizzando solo strumenti integrati di Linux? (solo riga di comando)

Risposte:


192

curl's -wl'opzione e la variabile secondaria url_effectiveè quello che stai cercando.

Qualcosa di simile a

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

Ulteriori informazioni

-L Segui i reindirizzamenti
-s Modalità silenziosa. Non produrre nulla
-o FILE Scrive l'output su <file> invece che su stdout
-w FORMAT Cosa emettere dopo il completamento

Di Più

Potresti anche voler aggiungere -I(che è una maiuscola i), che farà sì che il comando non scarichi alcun "corpo", ma poi usa anche il metodo HEAD, che non è quello che la domanda includeva e rischierebbe di cambiare ciò che fa il server. A volte i server non rispondono bene a HEAD anche quando rispondono bene a GET.


4
dovresti essere in grado di usare "-o / dev / null" se non vuoi il file
Gavin Mogan,

1
È un'ottima opzione, non sapevo che curl potesse farlo! Non smette mai di stupirmi:-)
Josh

1
È più una funzionalità di shell che curl
user151841

1
@DanielStenberg è necessario -Ialtrimenti scaricherà effettivamente il file.
Steven Penny

2
Alcuni siti web necessitano anche di un agente utente contraffatto con curl -A ...per reindirizzare alla posizione prevista.
Ivan Kozik

30

Grazie, questo mi ha aiutato. Ho apportato alcuni miglioramenti e li ho inseriti in uno script di supporto "finalurl":

#!/bin/bash
curl $1 -s -L -I -o /dev/null -w '%{url_effective}'
  • -o output a /dev/null
  • -I in realtà non scaricare, basta scoprire l'URL finale
  • -s modalità silenziosa, nessuna barra di avanzamento

Ciò ha reso possibile chiamare il comando da altri script come questo:

echo `finalurl http://someurl/`

2
Grazie per quelle idee. L'ho riscritto per l'utilizzo da terminale nel mio file .bashrc come funzione, e non c'è bisogno delle opzioni concise in quel file, quindi ho usato i nomi lunghi per documentare da solo questo:finalurl() { curl --silent --location --head --output /dev/null --write-out '%{url_effective}' -- "$@"; }
gw0

7

come altra opzione:

$ 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>

Ma non va oltre il primo.


6

Puoi farlo normalmente con wget. wget --content-disposition"url" inoltre se aggiungi -O /dev/nullnon salverai effettivamente il file.

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


Sostituisci -O /dev/nullsolo da a -O-. Meglio:wget -O- --content-disposition example.com
Maxwel Leite

1
wget -O / dev / null --content-disposition example.com e wget -O- / dev / null --content-disposition example.com producono molto più output dell'URL reindirizzato. curl $ 1 -s -L -I -o / dev / null -w '% {url_effective}' funziona bene per me.
Eric Klien,

5

Grazie. Ho finito per implementare i tuoi suggerimenti: 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

Restituisce vuoto se il sito Web non esegue il reindirizzamento, ma per me è abbastanza buono in quanto funziona su reindirizzamenti consecutivi.

Potrebbe essere difettoso, ma a prima vista funziona bene.


2

Questo funzionerebbe:

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

2

I parametri -L (--location)e -I (--head)ancora facendo richieste HEAD non necessarie all'URL della posizione.

Se sei sicuro di non avere più di un reindirizzamento, è meglio disabilitare la posizione di follow e utilizzare una variabile curl% {redirect_url}.

Questo codice esegue solo una richiesta HEAD all'URL specificato e accetta redirect_url da location-header:

curl --head --silent --write-out "%{redirect_url}\n" --output /dev/null "https://""goo.gl/QeJeQ4"

Test di velocità

all_videos_link.txt - 50 link di goo.gl + bit.ly che reindirizzano a youtube

1. Con seguire la posizione

time while read -r line; do
    curl -kIsL -w "%{url_effective}\n" -o /dev/null  $line
done < all_videos_link.txt

Risultati:

real    1m40.832s
user    0m9.266s
sys     0m15.375s

2. Senza seguire la posizione

time while read -r line; do
    curl -kIs -w "%{redirect_url}\n" -o /dev/null  $line
done < all_videos_link.txt

Risultati:

real    0m51.037s
user    0m5.297s
sys     0m8.094s

Sembra piuttosto raro che tu sappia in anticipo che ci sarebbe solo un reindirizzamento ...
SamB

1

Non sono sicuro di come farlo con curl, ma libwww-perl installa 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

0

Puoi provarci?

#!/bin/bash 
LOCATION=`curl -I 'http://your-domain.com/url/redirect?r=something&a=values-VALUES_FILES&e=zip' | perl -n -e '/^Location: (.*)$/ && print "$1\n"'` 
echo "$LOCATION"

Nota: quando esegui il comando curl -I http://tuo-dominio.com devo usare virgolette singole nel comando come curl -I 'http://your-domain.com'


-3

Potresti usare grep. non ti dice anche dove sta reindirizzando? Basta estrarlo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.