ฉันต้องการตรวจสอบว่า URL ใดเปลี่ยนเส้นทางเดียว ตัวอย่างดังกล่าวอาจเป็นลิงก์จากหน้าผลการค้นหาของ Google (ซึ่งการคลิกผ่านเซิร์ฟเวอร์ Google เสมอ)
ผมสามารถทำเช่นนั้นด้วยcurl
?
ฉันต้องการตรวจสอบว่า URL ใดเปลี่ยนเส้นทางเดียว ตัวอย่างดังกล่าวอาจเป็นลิงก์จากหน้าผลการค้นหาของ Google (ซึ่งการคลิกผ่านเซิร์ฟเวอร์ Google เสมอ)
ผมสามารถทำเช่นนั้นด้วยcurl
?
คำตอบ:
ลองสิ่งนี้:
$ 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
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/
มีวิธีที่ง่ายยิ่งขึ้น
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
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
หรือลองสิ่งนี้
curl -s -o /dev/null -I -w "HTTP_CODE: %{http_code}\nREDIRECT_URL: %{redirect_url}\n" http://raspberrypi.stackexchange.com/a/1521/86
curl -s -I 'http://yoururl'
และเนื้อหาของการตอบกลับด้วยcurl -s 'http://yoururl'
(คุณจะเห็นว่า Google ใช้ javascript แบบง่ายสำหรับการเปลี่ยนเส้นทาง)
พารามิเตอร์-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"