我有一些图片,我需要做一个HttpRequestMethod.HEAD,以便找出图像的一些细节。
当我在浏览器上转到图片网址时,它会毫无问题地加载。
当我尝试通过我的代码或在线工具获取标题信息时,它会失败
示例网址为http://www.adorama.com/images/large/CHHB74P.JPG
如前所述,我使用在线工具Hurl.It尝试获取Head请求,但我收到了与我的代码相同的403 Forbidden消息。 我已经尝试向Head请求添加许多不同的标头(User-Agent,Accept,Accept-Encoding,Accept-Language,Cache-Control,Connection,Host,Pragma,Upgrade-Insecure-Requests),但这似乎都不起作用。
它也无法通过Hurl.it执行正常的GET请求。同样403错误。
如果它是相关的,我的代码是一个c#web服务,并且正在AWS云上运行(以防万一到adorama服务器有针对AWS的东西,我不知道)。为了测试这个我还旋转了一个ec2(linux盒子)并运行curl,它也返回了403错误。在我的个人计算机上本地运行curl会返回二进制图像,这可能只是图像数据。
只是为了消除这些明显的想法,我的代码在许多其他网站上成功运行,只是存在问题的那个
我知道下载图片标题需要什么才能获得403?
答案 0 :(得分:3)
这里也有同样的问题。
在当地,它运作顺畅。从AWS实例执行此操作我遇到了同样的问题。
我认为这是DNS解析问题(重定向到故障节点)。因此,我尝试指定与客户解决的IP地址相同的IP地址,但没有解决问题。
我的猜测是Akamai(该服务由Akamai CDN提供,在这种情况下)阻止了AWS。可以理解的是,客户通过CDN的流量支付费用,通过滥用它,人们可以产生巨额账单。
连接到www.adorama.com(www.adorama.com)| 104.86.164.205 |:80 ...已连接。
HTTP request sent, awaiting response...
HTTP/1.1 403 Forbidden
Server: **AkamaiGHost**
Mime-Version: 1.0
Content-Type: text/html
Content-Length: 301
Cache-Control: max-age=604800
Date: Wed, 23 Mar 2016 09:34:20 GMT
Connection: close
2016-03-23 09:34:20 ERROR 403: Forbidden.
答案 1 :(得分:1)
我尝试了亚马逊的网址,但它并不适合我。 wget确实可以从其他不在Amazon EC2上的服务器上运行。这是EC2上的wget输出
wget -S http://www.adorama.com/images/large/CHHB74P.JPG
--2016-03-23 08:42:33-- http://www.adorama.com/images/large/CHHB74P.JPG
Resolving www.adorama.com... 23.40.219.79
Connecting to www.adorama.com|23.40.219.79|:80... connected.
HTTP request sent, awaiting response...
HTTP/1.0 403 Forbidden
Server: AkamaiGHost
Mime-Version: 1.0
Content-Type: text/html
Content-Length: 299
Cache-Control: max-age=604800
Date: Wed, 23 Mar 2016 08:42:33 GMT
Connection: close
2016-03-23 08:42:33 ERROR 403: Forbidden.
但是从其他Linux主机上它确实有效。这是输出
wget -S http://www.adorama.com/images/large/CHHB74P.JPG
--2016-03-23 08:43:11-- http://www.adorama.com/images/large/CHHB74P.JPG
Resolving www.adorama.com... 23.45.139.71
Connecting to www.adorama.com|23.45.139.71|:80... connected.
HTTP request sent, awaiting response...
HTTP/1.0 200 OK
Content-Type: image/jpeg
Last-Modified: Wed, 23 Mar 2016 08:41:57 GMT
Server: Microsoft-IIS/8.5
X-AspNet-Version: 2.0.50727
X-Powered-By: ASP.NET
ServerID: C01
Content-Length: 15131
Cache-Control: private, max-age=604800
Date: Wed, 23 Mar 2016 08:43:11 GMT
Connection: keep-alive
Set-Cookie: 1YDT=CT; expires=Wed, 20-Apr-2016 08:43:11 GMT; path=/; domain=.adorama.com
P3P: CP="NON DSP ADM DEV PSD OUR IND STP PHY PRE NAV UNI"
Length: 15131 (15K) [image/jpeg]
Saving to: \u201cCHHB74P.JPG\u201d
100%[=====================================>] 15,131 --.-K/s in 0s
2016-03-23 08:43:11 (460 MB/s) - \u201cCHHB74P.JPG\u201d saved [15131/15131]
我猜想图片提供商故意阻止来自EC2地址范围的请求。
两个示例中wget传出IP地址不同的原因是由于adorama提供的cdn提供商的DNS解析
答案 2 :(得分:1)
Web服务器可以实现检查特定指纹属性的方法,以防止自动机器人。这里有一些他们可以检查
您可以在此处模拟浏览器标题并了解一些指纹“属性”:https://panopticlick.eff.org
您可以尝试复制浏览器的行为方式并注入类似的标头/用户代理。普通卷曲/ wget不太可能满足这些条件,甚至像幻影之类的工具偶尔也会受阻。有些人更喜欢使用像selenium webdriver这样的工具来启动实际的浏览器。
答案 3 :(得分:0)
我发现使用另一个受AkamaiGHost保护的url由于用户代理中的某些部分而被阻止。使用协议链接的用户被阻止了:
使用curl -H 'User-Agent: some-user-agent' https://some.website
为不同的用户代理发现了以下结果:
Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:70.0) Gecko/20100101 Firefox/70.0
好的facebookexternalhit/1.1 (+http\://www.facebook.com/externalhit_uatext.php)
:403 https ://bar
:好的https://bar
:403 我现在唯一能找到的就是这个(被否决的)答案https://stackoverflow.com/a/48137940/230422,它说明标头值中不允许使用冒号(:
)。显然,这并不是唯一发生的事情,因为Mozilla示例也有一个冒号,而不仅仅是一个链接。
我猜想,至少大多数Web服务器都不在乎,并允许facebook的机器人和其他机器人在其用户代理中具有联系网址。但是看来AkamaiGHost确实阻止了它。