使用GET请求返回"200 OK",但使用HEAD请求返回"403 Forbidden"?

10
在几个月前,我发现我的网站在所有主要的搜索引擎中都无法出现在搜索结果中。最终,我找到了可能的原因。
我使用WebBug来调查服务器标头。如果请求是HEAD或GET,会有区别。
HEAD发送数据:
HEAD / HTTP/1.1
Host: www.attu.it
Connection: close
Accept: */*
User-Agent: WebBug/5.0

接收到的数据:

HTTP/1.1 403 Forbidden
Date: Tue, 10 Aug 2010 23:01:00 GMT
Server: Apache/2.2
Connection: close
Content-Type: text/html; charset=iso-8859-1

获取已发送的数据:

GET / HTTP/1.1
Host: www.attu.it
Connection: close
Accept: */*
User-Agent: WebBug/5.0

获取接收到的数据:

HTTP/1.1 200 OK
Date: Tue, 10 Aug 2010 23:06:15 GMT
Server: Apache/2.2
Last-Modified: Fri, 08 Jan 2010 08:58:01 GMT
ETag: "671f91b-2d2-47ca362815840"
Accept-Ranges: bytes
Content-Length: 722
Connection: close
Content-Type: text/html

// HTML code here

现在,浏览器默认发送GET请求(至少firebug是这样说的)。爬虫是否可能发送HEAD请求?如果是这样,为什么只有这个服务器响应403,而我维护的其他网站的其他服务器没有这种情况?
如果这很重要,在.htaccess中唯一存在的行是(除非我的客户更改了它,因为他们不想给我访问他们的服务器)
AddType text/x-component .htc

更新
感谢@Ryk。 FireBug和Fiddler都发送GET请求,得到200(或300)响应。正如预期的那样。所以我想这要么是服务器设置有问题(尽管很奇怪,因为托管公司拥有数百万客户),要么是他们在.htaccess文件中放置了一些东西。他们必须让我查看他们的帐户。

我提出的第二个问题是是否会导致网站在任何搜索引擎中都不出现(site:www.attu.it没有结果)。有什么想法吗?

更新2
经过一些折腾,发现根目录中存在phpMyAdmin机器人阻止的.htaccess文件,导致来自机器人的任何请求都会返回403 Forbidden。


这是服务器的一个bug,客户希望修复它,他们应该给你至少一些访问权限。最起码,问问他们是否能看到当前的.htaccess副本。 - Jon Hanna
3个回答

2
我曾经遇到过这个问题,因为我使用了签名URL。
每个签名URL只适用于一种方法(例如GET或HEAD)。如果您想使用多个方法,则必须拥有多个URL。

我认为这是我目前在Gradle构建中遇到的问题:https://stackoverflow.com/questions/48253755/gradle-failing-to-download-dependency-when-head-request-fails。你有任何想法如何解决这个问题吗? - Vic Seedoubleyew

2

一些管理员在httpd.conf中编写:

<Limit PUT DELETE COPY MOVE>
Order deny,allow
Deny from all
Allow from 10.0
</Limit>

<LimitExcept PUT DELETE COPY MOVE>
Order deny,allow
Deny from all
</LimitExcept>

这将对HEAD请求产生“禁止”状态。您应该检查此问题。


1

我建议安装Fiddler并仔细查看请求。有时候,页面上的一个需要身份验证的文件夹中的图标会导致返回403。

Fiddler会给你一个很好的想法,你也可以尝试使用Firefox并安装FireBug插件来检查页面错误。

查看网站时,我发现favicon.ico出现了一堆404错误,但除此之外,当我进行简单的GET请求时,我得到了200 OK,但当我进行HEAD请求时,我也得到了403。正在研究中。

更新:我认为这可能是Apache服务器上的配置问题,但不确定。http://hc.apache.org/httpclient-3.x/methods/head.html

更新2:阅读这篇文章http://www.pubbs.net/200811/httpd/17210-usershttpd-how-to-reject-head-request.html让我相信你的Apache服务器可能被设置为拒绝HEAD请求。在这种情况下,它将返回403。


@mjsarfatti - 我不确定,但如果网络爬虫使用HEAD请求来抓取网站,则会出现问题。 - Ryk
我发现使用curl比fiddler更容易。 - Vic Seedoubleyew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接