รับเป้าหมายการเปลี่ยนเส้นทางของ URL ด้วย curl


24

ฉันต้องการตรวจสอบว่า URL ใดเปลี่ยนเส้นทางเดียว ตัวอย่างดังกล่าวอาจเป็นลิงก์จากหน้าผลการค้นหาของ Google (ซึ่งการคลิกผ่านเซิร์ฟเวอร์ Google เสมอ)

ผมสามารถทำเช่นนั้นด้วยcurl?

คำตอบ:


18

ลองสิ่งนี้:

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

URL การเปลี่ยนเส้นทางของ Google นั้นแตกต่างกันเล็กน้อย พวกเขาส่งคืนการเปลี่ยนเส้นทาง Javascript ซึ่งสามารถประมวลผลได้ง่าย แต่ทำไมไม่ประมวลผล URL ดั้งเดิมและไปด้วยกัน?

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

การอ้างอิง

  1. สำหรับการถอดรหัส URL ...

วิธีพิเศษเกี่ยวกับ URL ที่มีอักขระพิเศษ (เช่นการเปลี่ยนเส้นทางของ Google) เช่น: google.com/…
syntagma

@REACHUS การเปลี่ยนเส้นทางถูกเข้ารหัสในสตริงการสืบค้นของ URL ที่กำหนด
อเล็กซ์แชมเบอร์เลน

@REACHUS ไม่ต้องกังวล - คุณสามารถรวมงบ 2 perl ได้
อเล็กซ์แชมเบอร์เลน

20

มีวิธีที่ง่ายยิ่งขึ้น

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

มันจะพิมพ์

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

สำหรับ URL

http://raspberrypi.stackexchange.com/a/1521/86

3
ซึ่งใช้เวลาและแบนด์วิดท์มากกว่าเนื่องจากคุณกำลังดาวน์โหลดหน้าที่สองด้วย
unhammer

1
@unhammer คุณถูกต้องอัพเดทคำตอบของฉันเพื่อทำคำขอหัวเท่านั้น
ismail

7

curlสามารถกำหนดค่าให้ติดตามการเปลี่ยนเส้นทางและพิมพ์ตัวแปรหลังจากเสร็จสิ้น ดังนั้นสิ่งที่คุณถามสามารถทำได้ด้วยคำสั่งต่อไปนี้:

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

หน้าคนอธิบายพารามิเตอร์ที่จำเป็นเช่น:

-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

4

หรือลองสิ่งนี้

curl -s -o /dev/null -I -w "HTTP_CODE: %{http_code}\nREDIRECT_URL: %{redirect_url}\n" http://raspberrypi.stackexchange.com/a/1521/86

วิธีพิเศษเกี่ยวกับ URL ที่มีอักขระพิเศษ (เช่นการเปลี่ยนเส้นทางของ Google) เช่น: google.com/…
syntagma

เพียงใส่ url ในเครื่องหมายคำพูดเดี่ยวเพื่อให้เชลล์ของคุณละเว้นอักขระพิเศษในลิงก์ แต่ลิงค์ที่คุณระบุไม่ได้เปลี่ยนเส้นทางไปยัง uri อื่นรหัสสถานะของการตอบสนองคือ 200 และไม่ใช่ 3xx uri ที่คุณค้นหานั้นซ่อนอยู่ใน uri นั้นตามลำดับในเนื้อหาของการตอบสนอง สำหรับการตรวจสอบเพิ่มเติมคุณสามารถศึกษาส่วนหัวของการตอบกลับด้วยcurl -s -I 'http://yoururl'และเนื้อหาของการตอบกลับด้วยcurl -s 'http://yoururl'(คุณจะเห็นว่า Google ใช้ javascript แบบง่ายสำหรับการเปลี่ยนเส้นทาง)
user1146332

0

พารามิเตอร์-L (--location)และ-I (--head)ยังคงทำ HEAD-request ที่ไม่จำเป็นไปยัง location-url

หากคุณแน่ใจว่าคุณจะไม่มีการเปลี่ยนเส้นทางมากกว่าหนึ่งครั้งจะเป็นการดีกว่าถ้าปิดการใช้งานการติดตามตำแหน่งและใช้ตัวแปร curl-variable% {redirect_url}

รหัสนี้ทำเพียง HEAD-request ที่ร้องขอไปยัง URL ที่ระบุและรับ redirect_url จาก location-header:

curl --head --silent --write-out "%{redirect_url}\n" --output /dev/null "https://goo.gl/QeJeQ4"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.