Obtenga el objetivo de redireccionamiento de URL con curl

24

Me gustaría comprobar dónde se redirige una única URL. Un ejemplo de eso podría ser un enlace desde la página de resultados de búsqueda de Google (donde un clic siempre pasa por el servidor de Google).

¿Puedo hacer eso con curl?

sintagma
fuente

Respuestas:

18

Prueba esto:

$ LOCATION=`curl -I http://raspberrypi.stackexchange.com/a/1521/86 | perl -n -e '/^Location: (.*)$/ && print "$1\n"'`
$ echo "$LOCATION"
/questions/1508/how-do-i-access-the-distributions-name-on-the-command-line/1521#1521

Redirecciones de Google

Las URL de redireccionamiento de Google son ligeramente diferentes. Devuelven un redireccionamiento de Javascript, que podría procesarse fácilmente, pero ¿por qué no procesar la URL original e ir todos juntos?

$ URL="http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CFAQFjAA&url=http%3A%2F%2Fwww.raspberrypi.org%2F&ei=rv8oUODIIMvKswa4xoHQAg&usg=AFQjCNEBMoebclm0Gk0LCZIStJbF04U1cQ"
$ LOCATION=`echo "$URL" | perl -n -e '/url=([a-zA-Z0-9%\.]*)/ && print "$1\n"'`
$ echo "$LOCATION"
http%3A%2F%2Fwww.raspberrypi.org%2F
$ echo "$LOCATION" | perl -pe 's/%([0-9a-f]{2})/sprintf("%s", pack("H2",$1))/eig'
http://www.raspberrypi.org/

Referencia

  1. Para decodificar url ...
Alex Chamberlain
fuente
¿Qué hay de las URL especiales con caracteres especiales (como los redireccionamientos de Google), por ejemplo: google.com/…
syntagma
@REACHUS La redirección está codificada en la cadena de consulta de la URL dada.
Alex Chamberlain
@REACHUS No se preocupe, probablemente pueda combinar las 2 declaraciones perl.
Alex Chamberlain
20

Hay una manera aún más fácil

curl -w "%{url_effective}\n" -I -L -s -S $URL -o /dev/null

imprimiría

http://raspberrypi.stackexchange.com/questions/1508/how-do-i-access-the-distributions-name-on-the-command-line/1521

para URL

http://raspberrypi.stackexchange.com/a/1521/86
ismail
fuente
3
Sin embargo, eso usa más tiempo y ancho de banda, ya que también está descargando la segunda página.
Martillo
1
@unhammer Tienes razón, actualicé mi respuesta para hacer solo solicitudes principales.
ismail
7

curl se puede configurar para seguir redirecciones e imprimir variables después de la finalización. Entonces, lo que pides se puede lograr con el siguiente comando:

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

La página del manual explica los parámetros necesarios como ese:

-L, --location          Follow redirects (H)
-s, --silent            Silent mode (don't output anything)
-w, --write-out FORMAT  Use output FORMAT after completion
-o, --output FILE       Write to FILE instead of stdout
schmijos
fuente
4

o prueba esto

curl -s -o /dev/null -I -w "HTTP_CODE: %{http_code}\nREDIRECT_URL: %{redirect_url}\n" http://raspberrypi.stackexchange.com/a/1521/86
usuario1146332
fuente
¿Qué hay de las URL especiales con caracteres especiales (como los redireccionamientos de Google), por ejemplo: google.com/…
syntagma
simplemente ponga la url entre comillas simples, de modo que su shell ignore los caracteres especiales en el enlace. Pero el enlace que ha indicado no redirige a otra uri, el código de estado de la respuesta es 200 y no 3xx. La uri que busca está oculta en la uri, respectivamente, en el contenido de la respuesta. Para un examen más detallado, puede estudiar el encabezado de la respuesta con curl -s -I 'http://yoururl'y el contenido de la respuesta con curl -s 'http://yoururl'(verá que google usa un javascript simple para la redirección).
user1146332
0

Los parámetros -L (--location)y -I (--head)aún haciendo innecesaria HEAD-request a la ubicación-url.

Si está seguro de que no tendrá más de una redirección, es mejor deshabilitar la ubicación de seguimiento y utilizar una variable de curva% {redirect_url}.

Este código solo realiza una solicitud HEAD a la URL especificada y toma redirect_url de location-header:

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