为什么浏览器会不卷曲下载此链接?


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浏览器正确访问和下载时,为什么不能正确下载该文件


7
我想指出的是,即使techraf对重定向的回答是完全正确的,但诸如标头之类的其他因素也可能导致服务器拒绝curl客户端下载文件的请求。例如,如果服务器具有后端DDoS保护,则此类保护软件通常会检查可行的浏览器标头,例如具有适当的User-Agent。另外,由于会话cookie(即,如果您已登录)仅存在于所述浏览器上,因此某些浏览器下载可能会成功。
Joseph A.

6
要对curl命令进行故障排除,可以使用curl -v“ verbose”。它将有关连接,请求和响应的各种信息打印为标准错误。在这种情况下,您会看到响应包括HTTP 302 Found(重定向代码)和Location带有URL 的标头。然后,您可以man curl找出如何告诉它遵循重定向的方法。
内森·朗

Answers:


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到HTTP重定向?太糟糕了,我对Curl独自一人呆着并不感到惊讶……
Toby Speight

如果这不能解决问题?可能与.asp东西有关?
mathtick

4

如果浏览器能够下载文件,则可以检查浏览器在做什么。在Google Chrome浏览器中,您可以使用以下内容查看发生的情况。

1)[查看>开发人员>开发人员工具>网络选项卡>标题选项卡]

2)点击下载链接。

3)文件链接将出现在开发人员工具选项卡上。

4)右键单击文件,然后选择复制>复制为cURL。

现在,您可以使用一个curl链接了。可能会有多余的参数可以修剪掉。

更多详细信息:https : //lornajane.net/posts/2013/chrome-feature-copy-as-curl


0

我将把这篇文章的评论之一转换为答案。

有许多HTTP / HTTPS链接需要某些标头才能起作用。因此,这将导致来自Web浏览器的有效响应,而不是后端Web请求(例如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");
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.