Отримайте остаточну URL-адресу після перенаправлення curl


110

Мені потрібно отримати кінцеву URL-адресу після переадресації сторінки, бажано за допомогою curl або wget.

Наприклад, http://google.com може переспрямувати на http://www.google.com .

Вміст легко отримати (наприклад, curl --max-redirs 10 http://google.com -L), але мене цікавить лише остаточний URL (у колишньому випадку http://www.google.com ).

Чи можливо це зробити за допомогою лише вбудованих інструментів Linux? (лише командний рядок)

Відповіді:


191

curl«S -wваріант і змінна до південь url_effectiveє те , що ви шукаєте.

Щось на зразок

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

Більше інформації

-L Дотримуйтесь переадресації
-s безшумний режим. Нічого не виводьте
-o FILE Запишіть вихід у <file> замість stdout
-w ФОРМАТИ Що вивести після завершення

Більше

Ви можете також додати -I(це верхній регістр i), який змусить команду не завантажувати жодне "тіло", але потім він також використовує метод HEAD, який не стосується питання та ризикує змінити те, що робить сервер. Іноді сервери не дуже добре реагують на HEAD, навіть коли вони чудово реагують на GET.


4
ви повинні мати можливість використовувати "-o / dev / null", якщо ви не хочете, щоб файл
Gavin Mogan

1
Це чудовий варіант, я ніколи не знав, що кучері можуть це зробити! Це ніколи не перестає мене дивувати:-)
Джош

1
Це більше функції оболонки, ніж curl
user151841

1
@DanielStenberg вам потрібно, -Iінакше він фактично завантажить файл.
Стівен Пенні

2
Деякі веб-сайти також потребують підробленого користувальницького агента, curl -A ...щоб перенаправити на очікуване місце.
Іван Козик

29

Дякую, що мені допомогли. Я вніс декілька вдосконалень і перетворив це на помічник сценарію "finalurl":

#!/bin/bash
curl $1 -s -L -I -o /dev/null -w '%{url_effective}'
  • -o вихід на /dev/null
  • -I насправді не завантажуйте, просто відкрийте кінцеву URL-адресу
  • -s безшумний режим, без смуг прогресу

Це дозволило викликати команду з інших подібних сценаріїв:

echo `finalurl http://someurl/`

2
Дякую за ці ідеї. Я переписав його для використання терміналу в моєму файлі .bashrc як функцію, і в цьому файлі немає необхідності в коротких параметрах, тому я використовував довгі імена, щоб самостійно документувати це:finalurl() { curl --silent --location --head --output /dev/null --write-out '%{url_effective}' -- "$@"; }
gw0

7

як інший варіант:

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

Але це не минає першого.


6

Зробити це можна звичайно за допомогою wget. wget --content-disposition"url" додатково, якщо ви додасте, -O /dev/nullви фактично не будете зберігати файл.

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


Замініть -O /dev/nullлише на -O-. Краще:wget -O- --content-disposition example.com
Максвел Лейт

1
wget -O / dev / null --content-disposition example.com і wget -O- / dev / null --content-disposition example.com дають набагато більше результатів, ніж перенаправлена ​​URL. curl $ 1 -s -L -I -o / dev / null -w '% {url_effective}' добре працює для мене.
Ерік

5

Дякую. Я закінчив реалізувати ваші пропозиції: 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

Повертається порожнім, якщо веб-сайт не перенаправляє, але це досить добре для мене, оскільки він працює при послідовних переадресаціях.

Може бути баггі, але на перший погляд це працює нормально.


2

Це спрацювало б:

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

2

Параметри -L (--location)і -I (--head)все ще роблять зайвий HEAD-запит до 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"

Тест на швидкість

all_videos_link.txt - 50 посилань goo.gl + bit.ly, які переспрямовують на youtube

1. З наступним розташуванням

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

Результати:

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

2. Без дотримання місця розташування

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

Результати:

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

Здається, досить незвично, що ви знали заздалегідь, що буде лише одне переадресація ...
SamB

1

Я не впевнений, як це зробити з завиткою, але libwww-perl встановлює псевдонім 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

Ви можете спробувати з цим?

#!/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"

Примітка: при виконанні команди curl -I http://your-domain.com доведеться використовувати одиничні лапки в команді, наприклад curl -I 'http://your-domain.com'


-3

Ви можете використовувати grep. не wget сказати вам, куди він перенаправляє теж? Просто зіткнути це.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.