Получить URL-адрес для перенаправления с помощью curl

24

Я хотел бы проверить, куда перенаправляет один URL. Примером этого может быть ссылка со страницы результатов поиска Google (где клик всегда проходит через сервер Google).

Могу ли я сделать это с curl?

синтагма
источник

Ответы:

18

Попробуй это:

$ 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 перенаправляет

URL перенаправления Google немного отличаются. Они возвращают Javascript-редирект, который можно легко обработать, но почему бы не обработать исходный URL-адрес и не свернуть все вместе?

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

Ссылка

  1. Для декодирования URL ...
Алекс Чемберлен
источник
Как насчет специальных URL-адресов со специальными символами (например, перенаправления Google), например: google.com/…
syntagma
@REACHUS Перенаправление закодировано в строке запроса данного URL.
Алекс Чемберлен
@REACHUS Не беспокойтесь - вы, вероятно, можете объединить 2 оператора perl.
Алекс Чемберлен
20

Есть еще более простой способ

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

это напечатало бы

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

для URL

http://raspberrypi.stackexchange.com/a/1521/86
исмаил
источник
3
Это требует больше времени и пропускной способности, поскольку вы также загружаете вторую страницу.
отбойный молоток
1
@unhammer Вы правы, обновил мой ответ только для выполнения запросов головы.
Исмаил
7

curl может быть настроен для отслеживания перенаправлений и печати переменных после завершения. Так что то, что вы просите, может быть достигнуто с помощью следующей команды:

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

Страница man объясняет необходимые параметры следующим образом:

-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
источник
4

или попробуйте это

curl -s -o /dev/null -I -w "HTTP_CODE: %{http_code}\nREDIRECT_URL: %{redirect_url}\n" http://raspberrypi.stackexchange.com/a/1521/86
user1146332
источник
Как насчет специальных URL со специальными символами (например, перенаправления Google), например: google.com/…
syntagma
просто поместите URL в одинарные кавычки, чтобы ваша оболочка игнорировала специальные символы в ссылке. Но указанная вами ссылка не перенаправляет на другой URI, код статуса ответа 200, а не 3xx. Uri, который вы ищете, скрыт в самом URI, соответственно, в содержании ответа. Для дальнейшего изучения вы можете изучить заголовок ответа curl -s -I 'http://yoururl'и содержание ответа curl -s 'http://yoururl'(вы увидите, что Google использует простой javascript для перенаправления).
user1146332
0

Параметры -L (--location)и -I (--head)до сих пор делают ненужный HEAD-запрос к location-url.

Если вы уверены, что у вас будет не более одного перенаправления, лучше отключить отслеживание местоположения и использовать переменную curl% {redirect_url}.

Этот код выполняет только один HEAD-запрос к указанному URL и берет redirect_url из location-header:

curl --head --silent --write-out "%{redirect_url}\n" --output /dev/null "https://goo.gl/QeJeQ4"
джеограф
источник