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?

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

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

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

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

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"
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.