2010-06-19 8 views
63

Ho bisogno di ottenere l'URL finale dopo una pagina di reindirizzamento preferibilmente con arricciatura o wget.Ottieni l'URL dopo che l'arricciatura viene reindirizzata

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

I contenuti sono facili da ottenere (ad esempio curl --max-redirs 10 http://google.com -L), ma sono interessato solo all'URL finale (nel primo caso http://www.google.com).

C'è un modo per farlo usando solo gli strumenti di linux buildin? (solo riga di comando)

risposta

93

curl 's opzione -w e la variabile sub url_effective è quello che stai cercando .

Qualcosa di simile

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

Maggiori informazioni

 
-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 

Più

Si potrebbe desiderare di aggiungere -I (che è un maiuscolo 'i'), così, che renderà il comando non scarica alcun "corpo", ma utilizza anche il metodo HEAD, che non è quello che la domanda includeva e rischia di cambiare cosa fa il server. A volte i server non rispondono bene a HEAD anche quando rispondono bene a GET.

+4

si dovrebbe essere in grado di usare "-o/dev/null" se non si desidera che il file –

+0

Questa è una grande opzione, non ho mai saputo arricciare potrebbe farlo! Non smette mai di stupirmi ':-)' – Josh

+1

Questa è più una funzione di shell che curl – user151841

-2

È possibile utilizzare grep. non ti dice dove si sta reindirizzando? Solo questo.

2

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 
4

come un'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.

3

Grazie. Ho finito per implementare i vostri suggerimenti: ricciolo -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 non redirect, ma questo è abbastanza buono per me come si lavora su redirezioni consecutivi.

Potrebbe essere bacato, ma a prima vista funziona bene.

18

Grazie, mi ha aiutato.Ho fatto alcuni miglioramenti e avvolto che in uno script helper "finalurl":

#!/bin/bash 
curl $1 -s -L -I -o /dev/null -w '%{url_effective}' 
  • uscita -o per /dev/null
  • -Non effettivamente scaricare, basta scoprire l'URL finale
  • -s modalità silenziosa, senza ProgressBars

questo ha permesso di chiamare i comandi di altri script come questo:

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

Grazie per quelli idee. L'ho riscritto per l'utilizzo del terminale nel mio file .bashrc come una funzione, e non c'è bisogno delle opzioni terse in quel file, quindi ho usato i nomi lunghi per autocertificarlo: 'finalurl() {curl --silent - posizione --head --output/dev/null --write-out '% {url_effective}' - "$ @"; } ' – buggy3

5

Si può fare questo con wget di solito. wget --content-disposition "url" inoltre se si aggiunge -O /dev/null non si sta effettivamente salvando il file.

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

0

Questo potrebbe funzionare:

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