ブラウザーがダウンロードするときにこのリンクをカールダウンロードしないのはなぜですか?


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このファイルがWebサイトに明らかに存在し、グラフィカルWebブラウザーを介して正しくアクセスおよびダウンロードできるのに、なぜこのファイルを正しくダウンロードできないのですか?


7
リダイレクトに関するtechrafの答えは完全に正しいものの、ヘッダーなどの他の要因により、サーバーがファイルをダウンロードするcurlクライアントの要求を拒否する可能性があることを指摘したいと思います。たとえば、サーバーにバックエンドDDoS保護が設定されている場合、このような保護ソフトウェアは通常、適切なを持っているなど、実行可能なブラウザーヘッダーをチェックしますUser-Agent。さらに、セッションCookie(ログインしている場合)がブラウザにのみ存在するため、一部のブラウザのダウンロードが成功する場合があります。
ジョセフA.

6
curlコマンドのトラブルシューティングにはcurl -v、「verbose」に使用できます。接続、要求、応答に関するさまざまな情報を標準エラーに出力します。この場合、応答にはHTTP 302 Found(リダイレクトコード)と、Location移動先のURLを含むヘッダーが含まれていることがわかります。次に、man curlリダイレクトに従うように指示する方法を見つけることができます。
ネイサンロング

回答:


59

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

6
HTTPSからHTTPへのリダイレクト?...それはひどいです、と私はよくカールの葉、それを一人でいることに驚いていないよ
トビースパイツ

そして、これで解決しない場合は?多分.aspのものと関係があるのでしょうか?
mathtick

4

ブラウザがファイルをダウンロードできる場合、ブラウザが何をしているかを調べることができます。グーグルクロームでは、以下を使用して何が起こっているのかを見ることができます。

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

2)ダウンロードリンクをクリックします。

3)ファイルリンクが開発者ツールタブに表示されます。

4)ファイルを右クリックして、[コピー]> [cURLとしてコピー]を選択します。

これで、動作するcurlリンクができました。おそらくトリムアウェイできる余分なパラメーターがあります。

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


0

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

動作するために特定のヘッダーを必要とする多くのHTTP / HTTPSリンクがあります。したがって、これにより、Webブラウザーからの正常な応答が得られますが、curlのようなバックエンド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");
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.