Pobierz końcowy URL po przekierowaniu curl


112

Muszę uzyskać końcowy adres URL po przekierowaniu strony, najlepiej za pomocą curl lub wget.

Na przykład http://google.com może przekierowywać do http://www.google.com .

Zawartość jest łatwa do pobrania (np. curl --max-redirs 10 http://google.com -L), Ale interesuje mnie tylko końcowy adres URL (w poprzednim przypadku http://www.google.com ).

Czy można to zrobić, używając tylko wbudowanych narzędzi systemu Linux? (tylko wiersz poleceń)

Odpowiedzi:


193

curl„s -wopcja i zmienna sub url_effectivejest to, czego szukasz.

Coś jak

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

Więcej informacji

-L Śledź przekierowania
-s Tryb cichy. Nie drukuj niczego
-o PLIK Zapisuje wyjście do <pliku> zamiast na standardowe wyjście
-w FORMAT Co wyprowadzić po zakończeniu

Więcej

Możesz też chcieć dodać -I(to jest wielkie litery i), co spowoduje, że polecenie nie pobierze żadnego „ciała”, ale następnie użyje metody HEAD, co nie jest tym, co zawierało pytanie i ryzykuje zmianę tego, co robi serwer. Czasami serwery nie reagują dobrze na HEAD, nawet jeśli odpowiadają dobrze na GET.


4
powinieneś móc użyć "-o / dev / null", jeśli nie chcesz pliku
Gavin Mogan

1
To świetna opcja, nigdy nie wiedziałem, że curl może to zrobić! Nigdy nie przestaje mnie zadziwiać:-)
Josh

1
To bardziej funkcja powłoki niż curl
user151841

1
@DanielStenberg potrzebujesz, w -Iprzeciwnym razie faktycznie pobierze plik.
Steven Penny

2
Niektóre witryny wymagają również sfałszowanego klienta użytkownika z curl -A ...przekierowaniem do oczekiwanej lokalizacji.
Ivan Kozik

30

Dzięki, to mi pomogło. Wprowadziłem kilka ulepszeń i zawarłem to w skrypcie pomocniczym „finalurl”:

#!/bin/bash
curl $1 -s -L -I -o /dev/null -w '%{url_effective}'
  • -o wyjście do /dev/null
  • -I właściwie nie pobieraj, po prostu odkryj końcowy URL
  • -s tryb cichy, brak pasków postępu

Umożliwiło to wywołanie polecenia z innych skryptów, takich jak ten:

echo `finalurl http://someurl/`

2
Dzięki za te pomysły. Przepisałem go do użycia terminala w moim pliku .bashrc jako funkcję i nie ma potrzeby stosowania zwięzłych opcji w tym pliku, więc użyłem długich nazw, aby samodzielnie udokumentować to:finalurl() { curl --silent --location --head --output /dev/null --write-out '%{url_effective}' -- "$@"; }
gw0

7

jako inna opcja:

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

Ale nie wychodzi poza pierwszy.


6

Zwykle możesz to zrobić za pomocą wget. wget --content-disposition„url” dodatkowo, jeśli dodasz -O /dev/null, nie będziesz faktycznie zapisywać pliku.

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


Wymień -O /dev/nulltylko z na -O-. Lepiej:wget -O- --content-disposition example.com
Maxwel Leite

1
wget -O / dev / null --content-disposition example.com i wget -O- / dev / null --content-disposition example.com generują dużo więcej danych wyjściowych niż przekierowany adres URL. curl $ 1 -s -L -I -o / dev / null -w '% {url_effective}' działa dobrze dla mnie.
Eric Klien

5

Dziękuję Ci. Skończyło się na wdrożeniu twoich sugestii: curl -i + grep

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

Zwraca wartość pustą, jeśli witryna nie przekierowuje, ale to wystarczy, ponieważ działa przy kolejnych przekierowaniach.

Może być wadliwy, ale na pierwszy rzut oka działa dobrze.


2

To zadziała:

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

2

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

Jeśli jesteś pewien, ż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 do określonego adresu URL i pobiera redirect_url z nagłówka lokalizacji:

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

Test prędkości

all_videos_link.txt - 50 linków goo.gl + bit.ly, które przekierowują do youtube

1. Z następującą lokalizacją

time while read -r line; do
    curl -kIsL -w "%{url_effective}\n" -o /dev/null  $line
done < all_videos_link.txt

Wyniki:

real    1m40.832s
user    0m9.266s
sys     0m15.375s

2. Bez śledzenia lokalizacji

time while read -r line; do
    curl -kIs -w "%{redirect_url}\n" -o /dev/null  $line
done < all_videos_link.txt

Wyniki:

real    0m51.037s
user    0m5.297s
sys     0m8.094s

Wydaje się dość rzadkie, że z góry wiedziałeś, że będzie tylko jedno przekierowanie ...
SamB

1

Nie jestem pewien, jak to zrobić za pomocą curl, ale libwww-perl instaluje 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

0

Czy możesz z tym spróbować?

#!/bin/bash 
LOCATION=`curl -I 'http://your-domain.com/url/redirect?r=something&a=values-VALUES_FILES&e=zip' | perl -n -e '/^Location: (.*)$/ && print "$1\n"'` 
echo "$LOCATION"

Uwaga: po wykonaniu polecenia curl -I http://twoja-domena.com należy użyć pojedynczych cudzysłowów w poleceniu, np. curl -I 'http://your-domain.com'


-3

Możesz użyć grep. nie powie Ci też, gdzie to przekierowuje? Po prostu wyłap to.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.