2010-06-19 25 views
63

Necesito obtener la url final después de una redirección de página preferiblemente con curl o wget.Obtener url después de curl se redirige

Por ejemplo http://google.com puede redirigir a http://www.google.com.

Los contenidos son fáciles de conseguir (por ejemplo, curl --max-redirs 10 http://google.com -L), pero solo me interesa la URL final (en el primer caso http://www.google.com).

¿Hay alguna forma de hacerlo utilizando solo las herramientas linux buildin? (línea de comando solamente)

Respuesta

93

curl-w opción y la variable secundaria url_effective es lo que está buscando .

Algo así como

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

Más información

 
-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 

Más

Es posible que desee añadir -I (es decir una mayúscula 'i'), así, lo que hará el comando no descarga ningún "cuerpo", pero también usa el método HEAD, que no es lo que la pregunta incluía y el riesgo cambiaba lo que hace el servidor A veces los servidores no responden bien a HEAD incluso cuando responden bien a GET.

+4

usted debería ser capaz de utilizar "-o/dev/null" si no desea que el archivo –

+0

Eso es una gran opción, no sabía curl podría hacer eso! Nunca deja de sorprenderme ':-)' – Josh

+1

Esa es más una función de shell que curl – user151841

-2

Puede usar grep. ¿no te dice dónde está redirigiendo también? Solo aguarda eso.

2

No estoy seguro de cómo hacerlo con curl, pero libwww-perl instala el 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

como otra opción:

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

Pero no va más allá de la primera.

3

Gracias. Terminé implementar sus sugerencias: rizo -i + grep

curl -i http://google.com -L | egrep -A 10 '301 Moved Permanently|302 Found' | grep 'Location' | awk -F': ' '{print $2}' | tail -1 

devoluciones en blanco si el sitio web no redirige, pero eso es lo suficientemente bueno para mí, ya que trabaja en redirecciones consecutivas.

Podría ser un error, pero de un vistazo funciona bien.

18

Gracias, eso me ayudó.Hice algunas mejoras y envolví que en un script de ayuda "finalurl":

#!/bin/bash 
curl $1 -s -L -I -o /dev/null -w '%{url_effective}' 
  • salida -o para /dev/null
  • -I realidad no descargar, solo descubrir la URL final
  • -s modo silencioso, no hay ProgressBars

esto hizo posible para llamar al comando desde otros scripts como esto:

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

Gracias por ideas. Lo reescribí para uso del terminal en mi archivo .bashrc como una función, y no hay necesidad de las opciones decisas en ese archivo, así que usé los nombres largos para auto-documentar esto: 'finalurl() {curl --silent - ubicación --head --output/dev/null --write-out '% {url_effective}' - "$ @"; } ' – buggy3

5

Puede hacer esto con wget habitualmente. wget --content-disposition "url" adicionalmente si agrega -O /dev/null no estará realmente guardando el archivo.

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

0

Esto funcionaría:

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