Obter destino de redirecionamento do URL com curl

24

Gostaria de verificar para onde um único URL redireciona. Um exemplo disso pode ser um link da página de resultados de pesquisa do Google (onde um clique sempre passa pelo servidor do Google).

Posso fazer isso com curl?

sintagma
fonte

Respostas:

18

Tente o seguinte:

$ 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

Redirecionamentos do Google

Os URLs de redirecionamento do Google são um pouco diferentes. Eles retornam um redirecionamento Javascript, que poderia ser facilmente processado, mas por que não processar o URL original e se enrolar 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/

Referência

  1. Para decodificação de URL ...
Alex Chamberlain
fonte
Como cerca de URLs especiais com caracteres especiais (como redirecionamentos do Google), por exemplo: google.com/...
sintagma
@REACHUS O redirecionamento é codificado na string de consulta do URL fornecido.
Alex Chamberlain
@REACHUS Não se preocupe - você provavelmente pode combinar as duas instruções perl.
Alex Chamberlain
20

Existe uma maneira ainda mais fácil

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

iria imprimir

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
fonte
3
Isso usa mais tempo e largura de banda, já que você está baixando a segunda página também.
unhammer
1
@unhammer Você está certo, atualizou minha resposta para fazer apenas pedidos de cabeça.
Ismail
7

curl pode ser configurado para seguir redirecionamentos e imprimir variáveis ​​após a conclusão. Portanto, o que você pede pode ser alcançado com o seguinte comando:

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

A página do manual explica os parâmetros necessários assim:

-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
fonte
4

ou tente isso

curl -s -o /dev/null -I -w "HTTP_CODE: %{http_code}\nREDIRECT_URL: %{redirect_url}\n" http://raspberrypi.stackexchange.com/a/1521/86
user1146332
fonte
Como cerca de URLs especiais com caracteres especiais (como redirecionamentos do Google), por exemplo: google.com/...
sintagma
basta colocar o URL entre aspas simples, para que seu shell ignore os caracteres especiais no link. Mas o link que você declarou não redireciona para outro URI, o código de status da resposta é 200 e não 3xx. O URI que você procura está oculto no próprio URI, respectivamente, no conteúdo da resposta. Para um exame mais aprofundado, você pode estudar o cabeçalho da resposta curl -s -I 'http://yoururl'e o conteúdo da resposta curl -s 'http://yoururl'(você verá que o Google usa um javascript simples para o redirecionamento).
user1146332
0

Os parâmetros -L (--location)e -I (--head)ainda fazendo solicitação HEAD desnecessária para o local-url.

Se você tiver certeza de que não terá mais de um redirecionamento, é melhor desativar o local de acompanhamento e usar uma variável de curvatura% {redirect_url}.

Este código faz apenas uma solicitação HEAD para o URL especificado e leva redirect_url do cabeçalho do local:

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