ทำไมจะไม่ดาวน์โหลดลิงค์นี้เมื่อเบราว์เซอร์จะ?


30

ฉันใช้ Mac OS 10.11.6 El Capitan มีลิงค์ที่ฉันต้องการดาวน์โหลดโดยทางโปรแกรม:

https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.16-osx10.11-x86_64.dmg

หากฉันวาง URL นี้ลงในเบราว์เซอร์ใด ๆ (เช่น Safari) การดาวน์โหลดจะทำงานได้อย่างสมบูรณ์

อย่างไรก็ตามหากฉันพยายามดาวน์โหลด URL เดียวกันจากบรรทัดคำสั่งโดยใช้curlมันไม่ทำงานผลที่ได้คือไฟล์เปล่า:

$ ls -lA
$ curl -O https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.16-osx10.11-x86_64.dmg
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
$ ls -lA
total 0
-rw-r--r--  1 myname  staff  0 Nov  7 14:07 mysql-5.7.16-osx10.11-x86_64.dmg
$ 

แน่นอนผมสามารถรับไฟล์ผ่านเบราว์เซอร์ แต่ฉันต้องการจะเข้าใจว่าทำไมcurlคำสั่งดังกล่าวไม่ทำงาน

เหตุใดจึงไม่สามารถcurlดาวน์โหลดไฟล์นี้ได้อย่างถูกต้องเมื่อไฟล์นั้นปรากฏบนเว็บไซต์และสามารถเข้าถึงและดาวน์โหลดได้อย่างถูกต้องผ่านเว็บเบราว์เซอร์กราฟิก


7
ฉันต้องการชี้ให้เห็นว่าแม้ว่าคำตอบของ techraf ในการเปลี่ยนเส้นทางนั้นถูกต้องสมบูรณ์ปัจจัยอื่น ๆ เช่นส่วนหัวอาจทำให้เซิร์ฟเวอร์ปฏิเสธคำขอของไคลเอนต์ curl เพื่อดาวน์โหลดไฟล์ ตัวอย่างเช่นถ้าเซิร์ฟเวอร์ที่มีการป้องกัน DDoS แบ็กเอนด์, User-Agentซอฟแวร์ป้องกันดังกล่าวตรวจสอบโดยทั่วไปสำหรับส่วนหัวของเบราว์เซอร์ที่ทำงานได้เช่นมีที่เหมาะสม นอกจากนี้การดาวน์โหลดเบราว์เซอร์บางครั้งอาจประสบความสำเร็จเนื่องจากคุกกี้เซสชัน (เช่นหากคุณลงชื่อเข้าใช้) จะปรากฏบนเบราว์เซอร์ดังกล่าวเท่านั้น
โจเซฟเอ

6
ในการแก้ไขปัญหาคำสั่ง curl คุณสามารถใช้curl -vสำหรับ "verbose" มันจะพิมพ์ไปยังข้อผิดพลาดมาตรฐานข้อมูลต่างๆเกี่ยวกับการเชื่อมต่อการร้องขอและการตอบสนอง ในกรณีนี้คุณจะเห็นว่าการตอบสนองนั้นรวมถึงHTTP 302 Found(รหัสการเปลี่ยนเส้นทาง) และLocationส่วนหัวที่มี URL ที่จะไป จากนั้นคุณสามารถman curlค้นหาวิธีบอกให้ทำตามการเปลี่ยนเส้นทาง
นาธานลอง

คำตอบ:


59

มีการเปลี่ยนเส้นทางบนเว็บเซิร์ฟเวอร์ฝั่งไปยัง URL http://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.16-osx10.11-x86_64.dmgต่อไปนี้: เนื่องจากเป็น CDN พฤติกรรมที่แน่นอน (ไม่ว่าคุณจะถูกเปลี่ยนเส้นทางหรือไม่ก็ตาม) อาจขึ้นอยู่กับตำแหน่งของคุณ

curlไม่ปฏิบัติตามการเปลี่ยนเส้นทางโดยค่าเริ่มต้น หากต้องการบอกให้เพิ่ม-Lอาร์กิวเมนต์:

curl -L -O https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.16-osx10.11-x86_64.dmg

6
HTTPS-to-HTTP redirect? มันแย่มากและฉันก็ไม่แปลกใจที่ Curl ทิ้งไว้คนเดียว ...
Toby Speight

และถ้าสิ่งนี้ไม่ได้แก้มัน? มีบางอย่างเกี่ยวกับ. asp
คณิตศาสตร์

4

หากเบราว์เซอร์สามารถดาวน์โหลดไฟล์ได้คุณสามารถตรวจสอบสิ่งที่เบราว์เซอร์กำลังทำอยู่ ใน google chrome คุณสามารถใช้สิ่งต่อไปนี้เพื่อดูว่าเกิดอะไรขึ้น

1) [ดู> นักพัฒนา> เครื่องมือสำหรับนักพัฒนา> แท็บเครือข่าย> แท็บส่วนหัว]

2) คลิกที่ลิงค์ดาวน์โหลด

3) ลิงก์ไฟล์จะปรากฏบนแท็บเครื่องมือสำหรับนักพัฒนา

4) คลิกขวาที่ไฟล์และเลือกคัดลอก> คัดลอกเป็น cURL

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

รายละเอียดเพิ่มเติม: https://lornajane.net/posts/2013/chrome-feature-copy-as-curl


0

ฉันจะแปลงหนึ่งในความคิดเห็นในโพสต์นี้เป็นคำตอบ

มีลิงก์ HTTP / HTTPS จำนวนมากที่ต้องการส่วนหัวที่แน่นอนเพื่อให้สามารถใช้งานได้ ดังนั้นสิ่งนี้จะส่งผลในการตอบสนองการทำงานจากเว็บเบราว์เซอร์ แต่ไม่ใช่การตอบสนองการทำงานในคำขอเว็บส่วนหลังเช่น curl

ฉันเพิ่งพบเว็บไซต์ที่ต้องการส่วนหัวต่อไปนี้ทั้งหมด ไม่สามารถระบุได้ทำให้หมดเวลา

  httpget.setHeader("User-Agent", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36");
  httpget.setHeader("Upgrade-Insecure-Requests", "1");
  httpget.setHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8");
  httpget.setHeader("Accept-Encoding", "gzip, deflate, br");
  httpget.setHeader("Accept-Language", "en-US,en;q=0.9");
  httpget.setHeader("Connection", "keep-alive");
  httpget.setHeader("Host", "www.thehost.com");
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.