Отримайте ціль для переадресації URL-адреси за допомогою локону


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 Reirects

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/…
синтагма

@REACHUS Переспрямування кодується у рядок запиту вказаної URL-адреси.
Алекс Чемберлен

@REACHUS Не хвилюйтесь - ви, ймовірно, можете комбінувати 2 твердження перл.
Алекс Чемберлен

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 Ви праві, оновив мою відповідь, щоб робити лише головні запити.
ismail

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

4

або спробуйте це

curl -s -o /dev/null -I -w "HTTP_CODE: %{http_code}\nREDIRECT_URL: %{redirect_url}\n" http://raspberrypi.stackexchange.com/a/1521/86

Як щодо спеціальних URL-адрес із спеціальними символами (наприклад, переспрямування Google), наприклад: google.com/…
синтагма

просто поставте URL-адресу в окремі лапки, щоб ваша оболонка ігнорувала спеціальні символи в посиланні. Але вказане вами посилання не перенаправляє на інший урі, код статусу відповіді - 200, а не 3xx. Урі, який ви шукаєте, прихований у самому урі відповідно до змісту відповіді. Для подальшого вивчення ви можете вивчити заголовок відповіді curl -s -I 'http://yoururl'та вміст відповіді з curl -s 'http://yoururl'(ви побачите, що Google використовує простий javascript для перенаправлення).
користувач1146332

0

Параметри -L (--location)і -I (--head)все ще роблять зайвий HEAD-запит до URL-адреси location.

Якщо ви впевнені, що у вас буде не більше одного переадресації, краще вимкнути наступне місцезнаходження та використовувати змінну curl% {redirect_url}.

Цей код виконує лише один HEAD-запит на вказану URL-адресу та приймає redirect_url з Location-header:

curl --head --silent --write-out "%{redirect_url}\n" --output /dev/null "https://goo.gl/QeJeQ4"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.