Dapatkan target pengalihan URL dengan curl

24

Saya ingin memeriksa di mana satu URL dialihkan. Contohnya bisa berupa tautan dari halaman hasil pencarian Google (di mana klik selalu melalui server Google).

Bisakah saya melakukannya curl?

syntagma
sumber

Jawaban:

18

Coba ini:

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

URL pengalihan Google sedikit berbeda. Mereka mengembalikan pengalihan Javascript, yang dapat dengan mudah diproses, tetapi mengapa tidak memproses URL asli dan untuk pergi bersama-sama?

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

Referensi

  1. Untuk url decode ...
Alex Chamberlain
sumber
Bagaimana dengan URL khusus dengan karakter khusus (seperti pengalihan Google), misal: google.com/...
syntagma
@REACHUS Pengalihan dikodekan ke string kueri dari URL yang diberikan.
Alex Chamberlain
@REACHUS Jangan khawatir - Anda mungkin dapat menggabungkan 2 pernyataan perl.
Alex Chamberlain
20

Bahkan ada cara yang lebih mudah

curl -w "%{url_effective}\n" -I -L -s -S $URL -o /dev/null

itu akan mencetak

http://raspberrypi.stackexchange.com/questions/1508/how-do-i-access-the-distributions-name-on-the-command-line/1521

untuk URL

http://raspberrypi.stackexchange.com/a/1521/86
ismail
sumber
3
Itu menggunakan lebih banyak waktu dan bandwidth, karena Anda juga mengunduh halaman kedua.
Unhammer
1
@unhammer Anda benar, perbarui jawaban saya untuk melakukan permintaan kepala saja.
ismail
7

curl dapat dikonfigurasi untuk mengikuti arahan ulang dan untuk mencetak variabel setelah selesai. Jadi apa yang Anda minta dapat dicapai dengan perintah berikut:

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

Halaman manual menjelaskan parameter yang diperlukan seperti itu:

-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
schmijos
sumber
4

atau coba ini

curl -s -o /dev/null -I -w "HTTP_CODE: %{http_code}\nREDIRECT_URL: %{redirect_url}\n" http://raspberrypi.stackexchange.com/a/1521/86
pengguna1146332
sumber
Bagaimana dengan URL khusus dengan karakter khusus (seperti pengalihan Google), misal: google.com/...
syntagma
cukup masukkan url dalam tanda kutip tunggal, sehingga shell Anda mengabaikan karakter khusus dalam tautan. Tetapi tautan yang Anda nyatakan tidak mengalihkan ke uri lain, kode status responsnya adalah 200 dan bukan 3xx. Uri yang Anda cari tersembunyi di uri itu sendiri masing-masing dalam isi respons. Untuk pemeriksaan lebih lanjut, Anda dapat mempelajari tajuk tanggapan dengan curl -s -I 'http://yoururl'dan isi tanggapannya curl -s 'http://yoururl'(Anda akan melihat bahwa google menggunakan javascript sederhana untuk pengalihan).
user1146332
0

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

Jika Anda yakin bahwa Anda tidak akan memiliki lebih dari satu pengalihan, lebih baik untuk menonaktifkan ikuti lokasi dan menggunakan curl-variable% {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"
Geografi
sumber