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


57

我尝试使用下载文件,wget并且curl它被拒绝并显示403错误(禁止)。

我可以使用同一台计算机上的Web浏览器查看文件。

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

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

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

但是还是禁止的。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

而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

很有意思。


7
检查引荐来源的页面确实很烦人。标头应该是可选的,并用于收集统计信息。
zaadeh 2014年

我发现最简单的方法是将其转换为zip文件并以这种方式使用。
piniyini 2015年

Answers:


40

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

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

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

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

如果您正在寻找可以轻松地从下载网站获取文件的方法,看看plowdown,包括在犁铧


另一个真正不正常的可能性是,由于某种原因,服务器被配置为在成功时返回403而不是200。
kasperd 2014年

1
这给了我所需的线索。尝试使用cookie后,我发现引荐来源是问题所在(现在,如果可以正确拼写!!)
starfry 2014年

2
如果仍然失败,请wget尝试添加--auth-no-challenge。像魔术一样工作。
乔纳森

13

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


这提供了极大的帮助,尤其是Chrome中的工具。当我尝试使用firefox时,我只能看到302之后的请求标头。在Chromium中,我可以看到两者,这为我提供了解决问题的信息。
starfry 2014年

1
@starfry您需要Enable persistent logs在Firefox开发工具的设置选项卡上打钩,以防止其清除重定向中的网络日志。Chrome浏览器有类似的选择。顺便说一句,“复制为cURL”已经存在于Firefox Nightly / Aurora / Beta中一段时间​​了,并将在下一个主要版本(31.0)中发布。
鲍勃

9

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

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

5

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

为使Cookie迷惑,Firefox“实时HTTP标头”插件是必不可少的。您可以看到设置了哪些cookie,以及哪些cookie被发送回了Web服务器。

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


1
我通过打开一个私人浏览窗口在Firefox中测试了没有cookie的情况,并且正如我所料,我收到403错误。有趣的是,您没有在新标签中看到错误。在铬,一个新的标签返回403
starfry

1
顺便说一句,您可以使用Firefox开发工具的“网络”标签来检查已发送和已接收的Cookie,而无需添加任何插件。铬/铬的同上。
鲍勃

@bob-是的,我发现了。我花了几分钟,因为那没什么。Firebug现在具有“复制为CURL”功能,但是很高兴看到它也是本机工具。
starfry 2014年

1

发生这种情况的另一个原因是,如果站点需要SSL。您的浏览器将自动从HTTP转发到HTTPS,但是curl和wget不会。因此,请尝试使用HTTPS而不是HTTP请求。


3
如果我是对的,这将以错误301或302(重定向)结束。
2015年
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.