Curl yeniden yönlendirildikten sonra nihai URL'yi alın


112

Tercihen curl veya wget ile bir sayfa yönlendirmesinden sonra nihai URL'yi almam gerekiyor.

Örneğin, http://google.com , http://www.google.com adresine yönlendirebilir .

İçeriği almak kolay (örn. curl --max-redirs 10 http://google.com -L), Ancak ben sadece son url ile ilgileniyorum (önceki durumda http://www.google.com ).

Bunu yalnızca yerleşik Linux araçlarını kullanarak yapmanın bir yolu var mı? (yalnızca komut satırı)

Yanıtlar:


195

curlbireyin -wseçenek ve alt değişken url_effectivearadığınız budur.

Gibi bir şey

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

Daha fazla bilgi

-L Yönlendirmeleri takip et
-s Sessiz mod. Hiçbir şey çıkarmayın
-o DOSYA Çıktıyı standart çıktı yerine <dosyaya> yaz
-w FORMAT Tamamlandıktan sonra ne çıktı alınacak

Daha

Eklemek isteyebilirsiniz -I(bu bir büyük harftir i), bu komutun herhangi bir "gövde" indirmemesini sağlar, ancak daha sonra, sorunun içerdiği şey olmayan ve sunucunun yaptığı şeyi değiştirme riski olan HEAD yöntemini de kullanır. Bazen sunucular GET'e iyi yanıt verseler bile HEAD'e iyi yanıt vermezler.


4
dosyayı istemiyorsanız "-o / dev / null" kullanabilmeniz gerekir
Gavin Mogan

1
Bu harika bir seçenek, curl'nin bunu yapabileceğini hiç bilmiyordum! Beni şaşırtmaktan asla vazgeçmiyor:-)
Josh

1
Bu
curl'den

1
@DanielStenberg İhtiyacınız olursa, -Iaksi takdirde dosyayı indirecektir.
Steven Penny

2
Bazı web siteleri curl -A ..., beklenen konuma yönlendirmek için sahte bir kullanıcı aracısına da ihtiyaç duyar .
Ivan Kozik

30

Teşekkürler, bu bana yardımcı oldu. Bazı iyileştirmeler yaptım ve bunu bir yardımcı komut dosyası "finalurl" ile sardım:

#!/bin/bash
curl $1 -s -L -I -o /dev/null -w '%{url_effective}'
  • -o çıktı /dev/null
  • -I aslında indirmeyin, sadece nihai URL'yi keşfedin
  • -s sessiz mod, ilerleme çubuğu yok

Bu, komutu şu gibi diğer komut dosyalarından çağırmayı mümkün kıldı:

echo `finalurl http://someurl/`

2
Bu fikirler için teşekkürler. Bunu .bashrc dosyamda bir işlev olarak terminal kullanımı için yeniden yazdım ve bu dosyadaki kısa seçeneklere gerek yok, bu yüzden bunu kendi kendine belgelemek için uzun adları kullandım:finalurl() { curl --silent --location --head --output /dev/null --write-out '%{url_effective}' -- "$@"; }
gw0

7

başka bir seçenek olarak:

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

Ama ilkini geçmiyor.


6

Bunu genellikle wget ile yapabilirsiniz. wget --content-disposition"url" ayrıca eklerseniz -O /dev/null, aslında dosyayı kaydetmiş olmayacaksınız.

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


-O /dev/nullSadece ile değiştirin -O-. Daha iyi:wget -O- --content-disposition example.com
Maxwel Leite

1
wget -O / dev / null --content-disposition example.com ve wget -O- / dev / null --content-disposition example.com, yeniden yönlendirilen URL'den çok daha fazla çıktı üretir. curl $ 1 -s -L -I -o / dev / null -w '% {url_effective}' benim için iyi çalışıyor.
Eric Klien

5

Teşekkür ederim. Önerilerinizi uyguladım: 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

Web sitesi yönlendirme yapmıyorsa boş döner, ancak ardışık yönlendirmelerde çalıştığı için bu benim için yeterince iyi.

Buggy olabilir, ancak bir bakışta iyi çalışıyor.


2

Bu işe yarar:

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

2

Parametreler -L (--location)ve -I (--head)konum-url'ye hala gereksiz HEAD isteği yapıyor.

Birden fazla yönlendirmeye sahip olmayacağınızdan eminseniz, takip konumunu devre dışı bırakmak ve bir curl-değişken% {redirect_url} kullanmak daha iyidir.

Bu kod, belirtilen URL'ye yalnızca bir HEAD isteği yapar ve konum başlığından redirect_url'yi alır:

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

Hız testi

all_videos_link.txt - youtube'a yönlendiren 50 goo.gl + bit.ly bağlantısı

1. Takip konumu ile

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

Sonuçlar:

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

2. Konumu takip etmeden

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

Sonuçlar:

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

Sadece bir yönlendirme olacağını önceden bilmeniz oldukça nadir görünüyor ...
SamB

1

Bunu curl ile nasıl yapacağımdan emin değilim, ancak libwww-perl GET takma adını yükler.

$ 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

Onunla deneyebilir misin?

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

Not: curl -I http://your-domain.com komutunu çalıştırdığınızda , komutta aşağıdaki gibi tek tırnak işaretleri kullanmak zorunda curl -I 'http://your-domain.com'


-3

Grep kullanabilirsin. nereye yönlendirdiğini de söylemiyor mu? Şunu anla.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.