Получить окончательный URL-адрес после перенаправления curl
Мне нужно получить окончательный URL-адрес после перенаправления страницы предпочтительно с помощью curl или wget.
Например, http://google.com может перенаправлять на http://www.google.com.
Содержимое легко получить (например, curl --max-redirs 10 http://google.com -L
), но меня интересует только окончательный URL (в первом случае http://www.google.com).
Есть ли способ сделать это, используя только встроенные инструменты Linux? (только командная строка)
Ответы
Ответ 1
-w
curl
-w
и его вспомогательная переменная url_effective
- это то, что вы ищете.
Что-то вроде
curl -Ls -o /dev/null -w %{url_effective} http://google.com
Больше информации
-L Follow redirects
-s Silent mode. Don't output anything
-o FILE Write output to <file> instead of stdout
-w FORMAT What to output after completion
Больше
Возможно, вы захотите добавить также -I
(это заглавная буква i
), что заставит команду не загружать "тело", но затем она также использует метод HEAD, который не входит в вопрос, и рискует изменить сервер делает. Иногда серверы плохо реагируют на HEAD, даже если они хорошо реагируют на GET.
Ответ 2
Спасибо, это мне помогло. Я сделал некоторые улучшения и завернул это в помощнике script "finalurl":
#!/bin/bash
curl $1 -s -L -I -o /dev/null -w '%{url_effective}'
- -o вывод в
/dev/null
- - Я действительно не загружаю, просто узнаю конечный URL
- -s тихий режим, без прогрессивных баров
Это позволило вызвать команду из других скриптов, как это:
echo `finalurl http://someurl/`
Ответ 3
Вы можете сделать это с помощью wget обычно. wget --content-disposition
"url" дополнительно, если вы добавите -O /dev/null
, вы фактически не сохраните файл.
wget -O /dev/null --content-disposition example.com
Ответ 4
в качестве еще одной опции:
$ 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>
Но он не проходит мимо первого.
Ответ 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
Возвращает пустое значение, если веб-сайт не перенаправляется, но это достаточно хорошо для меня, поскольку оно работает с последовательными перенаправлениями.
Может быть глючит, но с первого взгляда он работает нормально.
Ответ 6
Я не уверен, как это сделать с помощью curl, но 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
Ответ 7
Это будет работать:
curl -I somesite.com | perl -n -e '/^Location: (.*)$/ && print "$1\n"'
Ответ 8
Параметры -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
Ответ 9
Вы можете использовать grep. не wget сказать вам, где это перенаправление тоже? Просто сделайте это.