为什么 curl 和 wget 会导致 403 被禁止?

sta*_*fry 72 wget curl

我尝试使用wget和下载文件,curl但因 403 错误(禁止)而被拒绝。

我可以在同一台机器上使用网络浏览器查看文件。

我再次尝试使用通过http://www.whatsmyuseragent.com获得的浏览器的用户代理。我这样做:

wget -U 'Mozilla/5.0 (X11; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0' http://...
Run Code Online (Sandbox Code Playgroud)

curl -A 'Mozilla/5.0 (X11; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0' http://...
Run Code Online (Sandbox Code Playgroud)

但它仍然被禁止。403 可能还有什么其他原因,我可以通过什么方式更改wgetcurl命令来克服它们?

(这不是关于能够获取文件 - 我知道我可以从浏览器中保存它;这是关于理解为什么命令行工具的工作方式不同)

更新

感谢所有对这个问题的出色回答。我遇到的具体问题是服务器正在检查引用者。通过将其添加到命令行,我可以使用curl和获取文件wget

检查引用者的服务器通过 302 跳转到另一个根本不执行检查的位置,因此该站点的curlwget工作正常。

如果有人感兴趣,这是因为我正在阅读页面以了解嵌入式 CSS,并试图以该站点的 css 为例。我遇到麻烦的实际 URL 是这个curl我最终得到的是

curl -L -H 'Referer: http://css-tricks.com/forums/topic/font-face-in-base64-is-cross-browser-compatible/' http://cloud.typography.com/610186/691184/css/fonts.css
Run Code Online (Sandbox Code Playgroud)

和 wget 是

 wget --referer='http://css-tricks.com/forums/topic/font-face-in-base64-is-cross-browser-compatible/' http://cloud.typography.com/610186/691184/css/fonts.css
Run Code Online (Sandbox Code Playgroud)

很有意思。

Lek*_*eyn 46

HTTP 请求可能包含更多不是由 curl 或 wget 设置的标头。例如:

  • Cookie:这是请求被拒绝的最可能原因,我在下载站点上看到过这种情况。给定一个 cookie key=val,您可以使用-b key=val(或--cookie key=val)选项设置它curl
  • 引用(原文如此):当点击网页上的链接时,大多数浏览器倾向于将当前页面作为引用发送。不应该依赖它,但即使 eBay 也未能在此标头不存在时重置密码。所以是的,它可能会发生。在curl这个选项是-e URL--referer URL
  • 授权:由于用户名/密码对话框的 UI 不可控,这现在变得不那么流行了,但它仍然是可能的。可以curl使用-u user:password(或--user user:password) 选项进行设置。
  • 用户代理:根据用户代理的不同,某些请求会产生不同的响应。这可以以好的方式使用(提供真实的下载而不是镜像列表),也可以以不好的方式使用(拒绝不以Mozilla、 或包含Wget或开头的用户代理curl)。

您通常可以使用浏览器的开发工具(Firefox 和 Chrome 支持)来读取浏览器发送的标头。如果连接未加密(即未使用 HTTPS),那么您也可以为此使用数据包嗅探器,例如 Wireshark。

除了这些标头之外,网站也可能会在幕后触发一些改变状态的动作。例如,打开一个页面时,有可能在后台执行一个请求来准备下载链接。或者重定向发生在页面上。这些操作通常使用 Javascript,但也可能有一个隐藏的框架来促进这些操作。

如果您正在寻找一种从下载站点轻松获取文件的方法,请查看 plowdown,包含在plowshare 中

  • 如果它在 `wget` 中*仍然失败*,请尝试添加 `--auth-no-challenge`。像魔术一样工作。 (2认同)

小智 22

尝试了以上所有方法,但没有运气;使用开发浏览器工具获取用户代理字符串,添加以下内容后,成功:

--user-agent="Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"
Run Code Online (Sandbox Code Playgroud)

  • 这对我也有用,但是较短的用户代理名称也可能很好,例如“Mozilla”。/sf/answers/2591535761/ (2认同)

小智 16

只是要添加到上面的答案,你可以使用“复制为卷曲”功能目前在Chrome开发者工具(因为v26.0)和萤火虫(自V1.12)。您可以通过右键单击网络选项卡中的请求行来访问此功能。


Bru*_*ger 5

根据您的要求,它可能是一个 cookie。使用 Firefox,您可以在有问题的页面上单击鼠标右键,“查看页面信息”。选择“安全”图标,然后单击“查看 Cookies”按钮。

为了解决 cookie,Firefox “Live HTTP Headers”插件是必不可少的。您可以查看设置了哪些 cookie,以及将哪些 cookie 发送回 Web 服务器。

wget可以使用 cookie,但它完全令人气愤,因为它没有暗示它没有发送 cookie。最好的办法是从您的浏览器中删除所有相关的 cookie,并通过它所需要的任何初始登录或页面查看顺序。查看“实时 HTTP 标头”以获取 cookie 以及任何 POST 或 GET 参数。wget使用“--keep-session-cookies”和“--save-cookies”选项执行第一个登录步骤。这将为您提供一个可以使用文本编辑器查看的 cookie 文件。使用wget --load-cookies与下一步骤的cookie文件。