ブラウザからダウンロードできますが、なぜこのリンクをダウンロードできないのですか?

ブラウザからダウンロードできますが、なぜこのリンクをダウンロードできないのですか?

私は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なぜこのファイルを正しくダウンロードできないのですか?ウェブサイトに視覚的に存在し、グラフィックWebブラウザを介して正しくアクセスしてダウンロードできるのはいつですか?

答え1

Webサーバー側から次の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

答え2

ブラウザがファイルをダウンロードできる場合は、ブラウザが何をしているのかを確認できます。 Google Chrome では、次のコマンドを使用して何が起こっているかを確認できます。

1)[表示 > 開発者 > 開発者ツール > ネットワークタブ > ヘッダタブ]

2)ダウンロードリンクをクリックしてください。

3) Developer Toolsタブにファイルリンクが表示されます。

4) ファイルを右クリックし、コピー/cURL にコピーを選択します。

これで利用可能なカールリンクができました。整理できる重複パラメータがある可能性があります。

詳細は: https://lornajane.net/posts/2013/chrome-feature-copy-as-curl

答え3

この投稿のコメントの1つを回答に変換します。

特定のヘッダーが機能する必要があるHTTP / HTTPSリンクがたくさんあります。したがって、これはWebブラウザで有効な応答を引き起こしますが、カールなどのバックエンドWebリクエストではそうではありません。

次のヘッダーがすべて必要なWebサイトを見つけました。これを指定しないと、タイムアウトが発生します。

  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");

関連情報