Dapatkan URL final setelah curl dialihkan

110

Saya perlu mendapatkan URL final setelah pengalihan halaman, sebaiknya dengan curl atau wget.

Misalnya http://google.com dapat dialihkan ke http://www.google.com .

Isinya mudah didapat (mis. curl --max-redirs 10 http://google.com -L), Tetapi saya hanya tertarik pada url terakhir (dalam kasus sebelumnya http://www.google.com ).

Apakah ada cara untuk melakukan ini dengan hanya menggunakan alat bawaan Linux? (hanya baris perintah)

ragum
sumber

Jawaban:

191

curl's -wpilihan dan sub variabel url_effectiveadalah apa yang Anda cari.

Sesuatu seperti

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

Info lebih lanjut

-L Ikuti pengalihan
-s mode Diam. Jangan mengeluarkan apa pun
-o FILE Tuliskan keluaran ke <file> sebagai ganti stdout
-w FORMAT Apa yang akan dikeluarkan setelah selesai

Lebih

Anda mungkin ingin menambahkan -I(itu adalah huruf besar i) juga, yang akan membuat perintah tidak mengunduh "body", tetapi kemudian juga menggunakan metode HEAD, yang bukan pertanyaan yang disertakan dan berisiko mengubah apa yang dilakukan server. Terkadang server tidak merespons HEAD dengan baik meskipun mereka merespons GET dengan baik.

Daniel Stenberg
sumber
4
Anda harus dapat menggunakan "-o / dev / null" jika Anda tidak menginginkan file tersebut
Gavin Mogan
1
Itu pilihan yang bagus, saya tidak pernah tahu curl bisa melakukan itu! Itu tidak pernah berhenti membuat saya takjub:-)
Josh
1
Itu lebih merupakan fitur shell daripada curl
user151841
1
@DanielStenberg yang Anda perlukan -Ijika tidak maka file akan benar-benar diunduh.
Steven Penny
2
Beberapa situs web juga membutuhkan agen pengguna palsu curl -A ...untuk mengarahkan ke lokasi yang diharapkan.
Ivan Kozik
29

Terima kasih, itu membantu saya. Saya membuat beberapa perbaikan dan membungkusnya dengan skrip pembantu "finalurl":

#!/bin/bash
curl $1 -s -L -I -o /dev/null -w '%{url_effective}'
  • -o keluaran ke /dev/null
  • -I tidak benar-benar mengunduh, temukan saja URL finalnya
  • -s mode diam, tidak ada bilah kemajuan

Ini memungkinkan untuk memanggil perintah dari skrip lain seperti ini:

echo `finalurl http://someurl/`
Jan Koriťák
sumber
2
Terima kasih atas ide-ide itu. Saya menulis ulang untuk penggunaan terminal di file .bashrc saya sebagai fungsi, dan tidak perlu opsi singkat di file itu, jadi saya menggunakan nama panjang untuk mendokumentasikan sendiri ini:finalurl() { curl --silent --location --head --output /dev/null --write-out '%{url_effective}' -- "$@"; }
gw0
7

sebagai opsi lain:

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

Tapi itu tidak melewati yang pertama.

Gavin Mogan
sumber
6

Anda biasanya dapat melakukan ini dengan wget. wget --content-disposition"url" tambahan jika Anda menambahkan -O /dev/nullAnda tidak akan benar-benar menyimpan file.

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

Burung elang
sumber
Ganti dari -O /dev/nullmenjadi saja -O-. Lebih baik:wget -O- --content-disposition example.com
Maxwel Leite
1
wget -O / dev / null --content-disposition example.com dan wget -O- / dev / null --content-disposition example.com menghasilkan lebih banyak keluaran daripada URL yang dialihkan. curl $ 1 -s -L -I -o / dev / null -w '% {url_effective}' berfungsi dengan baik untuk saya.
Eric Klien
5

Terima kasih. Saya akhirnya menerapkan saran Anda: 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

Mengembalikan kosong jika situs web tidak mengalihkan, tetapi itu cukup baik bagi saya karena berfungsi pada pengalihan berturut-turut.

Mungkin buggy, tapi sekilas berfungsi dengan baik.

ragum
sumber
2

Ini akan berhasil:

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

Parameter -L (--location)dan -I (--head)masih melakukan permintaan HEAD yang tidak perlu ke lokasi-url.

Jika Anda yakin bahwa Anda tidak akan memiliki lebih dari satu pengalihan, lebih baik nonaktifkan lokasi mengikuti dan gunakan variabel-curl% {redirect_url}.

Kode ini hanya melakukan satu permintaan HEAD ke URL yang ditentukan dan mengambil redirect_url dari header lokasi:

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

Tes kecepatan

all_videos_link.txt - 50 tautan goo.gl + bit.ly yang dialihkan ke youtube

1. Dengan mengikuti lokasi

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

Hasil:

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

2. Tanpa mengikuti lokasi

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

Hasil:

real    0m51.037s
user    0m5.297s
sys     0m8.094s
Geograf
sumber
Tampaknya sangat jarang Anda tahu sebelumnya bahwa hanya akan ada satu pengalihan ...
SamB
1

Saya tidak yakin bagaimana melakukannya dengan curl, tetapi libwww-perl menginstal alias 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
Gavin Mogan
sumber
0

Bisakah kamu mencobanya?

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

Catatan: ketika Anda menjalankan perintah curl -I http://your-domain.com harus menggunakan tanda kutip tunggal pada perintah seperti curl -I 'http://your-domain.com'

lakshmikandan
sumber
-3

Anda bisa menggunakan grep. tidak akan memberi tahu Anda di mana itu mengarahkan juga? Grep saja.

SpliFF
sumber