Tại sao sẽ không tải xuống liên kết này khi trình duyệt sẽ?


30

Tôi đang chạy Mac OS 10.11.6 El Capitan. Có một liên kết tôi muốn tải về theo chương trình:

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

Nếu tôi dán URL này vào bất kỳ trình duyệt nào (ví dụ Safari), quá trình tải xuống hoạt động hoàn hảo.

Tuy nhiên, nếu tôi cố tải xuống cùng một URL từ dòng lệnh bằng cách sử dụng curl, thì nó không hoạt động. Kết quả là một tệp trống:

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

Tất nhiên tôi có thể nhận được các tập tin thông qua trình duyệt, nhưng tôi muốn hiểu lý do tại sao các curllệnh trên không làm việc.

Tại sao không thể curltải xuống tệp này một cách chính xác, khi nó hiển thị rõ ràng trên trang web và có thể được truy cập và tải xuống chính xác thông qua trình duyệt web đồ họa?


7
Tôi muốn chỉ ra rằng mặc dù câu trả lời của techraf về chuyển hướng là hoàn toàn chính xác, các yếu tố khác như tiêu đề có thể khiến máy chủ từ chối yêu cầu của khách hàng curl để tải xuống tệp. Ví dụ: nếu máy chủ có bảo vệ DDoS phụ trợ, phần mềm bảo vệ đó thường kiểm tra các tiêu đề trình duyệt khả thi, chẳng hạn như có một phần mềm thích hợp User-Agent. Ngoài ra, một số tải xuống trình duyệt có thể thành công do cookie phiên (tức là nếu bạn đã đăng nhập) chỉ hiện diện trên trình duyệt đã nói.
Joseph A.

6
Để khắc phục sự cố lệnh curl, bạn có thể sử dụng curl -vcho "verbose". Nó sẽ in ra lỗi tiêu chuẩn thông tin khác nhau về kết nối, yêu cầu và phản hồi. Trong trường hợp này, bạn sẽ thấy rằng phản hồi bao gồm HTTP 302 Found(mã chuyển hướng) và Locationtiêu đề có URL đi đến. Sau đó, bạn có thể man curltìm hiểu làm thế nào để nói với nó để đi theo chuyển hướng.
Nathan Long

Câu trả lời:


59

Có một chuyển hướng trên phía máy chủ web đến URL sau : http://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.16-osx10.11-x86_64.dmg. Vì đó là CDN, hành vi chính xác (cho dù bạn có được chuyển hướng hay không) có thể phụ thuộc vào vị trí của bạn.

curlkhông theo chuyển hướng theo mặc định. Để bảo nó làm như vậy, thêm -Lđối số:

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

6
Chuyển hướng HTTPS-to-HTTP? Điều đó thật tồi tệ, và tôi không ngạc nhiên khi Curl để nó một mình ...
Toby Speight

Và nếu điều này không giải quyết nó? Một cái gì đó để làm với .asp công cụ có thể?
mathtick

4

Nếu trình duyệt có thể tải xuống tệp, bạn có thể kiểm tra trình duyệt đang làm gì. Trên google chrome, bạn có thể sử dụng thông tin sau để xem điều gì đang xảy ra.

1) [Xem> Nhà phát triển> Công cụ dành cho nhà phát triển> Tab Mạng> tab Tiêu đề]

2) Nhấp vào liên kết tải xuống.

3) Liên kết tệp sẽ xuất hiện trên tab công cụ dành cho nhà phát triển.

4) Nhấp chuột phải vào tệp và chọn Sao chép> Sao chép dưới dạng cURL.

Bây giờ bạn có một liên kết curl sẽ làm việc. Nó có thể sẽ có các tham số dư thừa bạn có thể cắt đi.

Thêm chi tiết: https://lornajane.net/posts/2013/chrom-feature-copy-as-curl


0

Tôi sẽ chuyển đổi một trong những ý kiến ​​về bài đăng này để trả lời.

Có nhiều liên kết HTTP / HTTPS yêu cầu các tiêu đề nhất định để hoạt động. Vì vậy, điều này sẽ dẫn đến phản hồi làm việc từ trình duyệt web nhưng không phản hồi hoạt động trong yêu cầu web phụ trợ như curl.

Tôi vừa chạy vào một trang web yêu cầu tất cả các tiêu đề sau. Không chỉ định chúng dẫn đến thời gian chờ.

  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");
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.