Uzyskaj cel przekierowania adresu URL za pomocą curl

24

Chciałbym sprawdzić, gdzie przekierowuje pojedynczy adres URL. Przykładem może być link ze strony wyników wyszukiwania Google (gdzie kliknięcie zawsze przechodzi przez serwer Google).

Czy mogę to zrobić curl?

syntagma
źródło

Odpowiedzi:

18

Spróbuj tego:

$ 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

Google przekierowuje

Adresy URL przekierowań Google są nieco inne. Zwracają przekierowanie Javascript, które można łatwo przetworzyć, ale dlaczego nie przetworzyć oryginalnego adresu URL i przejść do zwijania się razem?

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

Odniesienie

  1. Do dekodowania adresu URL ...
Alex Chamberlain
źródło
Co powiesz na specjalne adresy URL ze znakami specjalnymi (np. Przekierowania Google), np .: google.com/…
syntagma
@ REACHUS Przekierowanie jest zakodowane w ciągu zapytania podanego adresu URL.
Alex Chamberlain,
@ REACHUS Nie martw się - prawdopodobnie możesz połączyć 2 instrukcje perla.
Alex Chamberlain,
20

Jest jeszcze łatwiejszy sposób

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

wydrukuje się

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

dla adresu URL

http://raspberrypi.stackexchange.com/a/1521/86
ismail
źródło
3
Zużywa to jednak więcej czasu i przepustowości, ponieważ pobierasz również drugą stronę.
młotek
1
@unhammer Masz rację, zaktualizowałem moją odpowiedź, aby tylko kierować prośby.
ismail
7

curl można skonfigurować tak, aby śledził przekierowania i drukował zmienne po zakończeniu. Więc to, o co prosisz, można osiągnąć za pomocą następującego polecenia:

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

Strona podręcznika wyjaśnia niezbędne parametry:

-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
źródło
4

lub spróbuj tego

curl -s -o /dev/null -I -w "HTTP_CODE: %{http_code}\nREDIRECT_URL: %{redirect_url}\n" http://raspberrypi.stackexchange.com/a/1521/86
użytkownik1146332
źródło
Co powiesz na specjalne adresy URL ze znakami specjalnymi (jak przekierowania Google), np .: google.com/…
syntagma
po prostu umieść adres URL w pojedynczym cudzysłowie, aby Twoja powłoka ignorowała znaki specjalne w łączu. Ale podany link nie przekierowuje do innego identyfikatora użytkownika, kod stanu odpowiedzi to 200, a nie 3xx. Uri, którego szukasz, jest ukryte odpowiednio w samym uri w treści odpowiedzi. W celu dalszego zbadania możesz przestudiować nagłówek odpowiedzi za pomocą curl -s -I 'http://yoururl'i treść odpowiedzi za pomocą curl -s 'http://yoururl'(zobaczysz, że Google używa prostego javascript do przekierowania).
user1146332,
0

Parametry -L (--location)i -I (--head)nadal niepotrzebne żądanie HEAD do adresu URL lokalizacji.

Jeśli masz pewność, że nie będziesz mieć więcej niż jednego przekierowania, lepiej wyłączyć śledzenie lokalizacji i użyć zmiennej curl% {redirect_url}.

Ten kod wykonuje tylko jedno żądanie HEAD na podany adres URL i pobiera adres_przekierowania z nagłówka lokalizacji:

curl --head --silent --write-out "%{redirect_url}\n" --output /dev/null "https://goo.gl/QeJeQ4"
Geografia
źródło