Чому не буде згортати завантаження цього посилання, коли браузер буде?


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. Крім того, деякі завантаження браузера можуть бути успішними через те, що файли cookie сеансу (тобто якщо ви ввійшли в систему) присутні лише у вказаному браузері.
Йосип А.

6
Щоб усунути неполадки з командою curl, ви можете використовувати curl -vдля "багатослів'я". Він надрукує на стандартну помилку різну інформацію про з'єднання, запит та відповідь. У цьому випадку ви побачите, що відповідь включає HTTP 302 Found(код переспрямування) та Locationзаголовок з URL-адресою, до якої потрібно звернутися. Тоді ви могли man curlб дізнатися, як сказати йому слідувати переспрямуванням.
Натан Лонг

Відповіді:


59

Існує редирект на веб - сервер стороні за наступною адресою: 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 на HTTP? Це жахливо, і я не здивований, що Curl це добре залишає в спокої ...
Toby Speight

І якщо це не вирішить? Щось спільного з .asp речі, можливо?
mathtick

4

Якщо браузер зможе завантажити файл, ви можете перевірити, що робить браузер. У Google Chrome ви можете скористатись наведеним нижче, щоб побачити, що відбувається.

1) [Перегляд> Розробник> Інструменти для розробників> Вкладка мережі> Вкладка Заголовки]

2) Натисніть на посилання для завантаження.

3) Посилання на файл з’явиться на вкладці Інструменти для розробників.

4) Клацніть правою кнопкою миші на файл і виберіть Копіювати> Копіювати як 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");
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.