HEAD 请求在 GET “200 ok”时收到“403 禁止”?

Posted

技术标签:

【中文标题】HEAD 请求在 GET “200 ok”时收到“403 禁止”?【英文标题】:HEAD request receives "403 forbidden" while GET "200 ok"? 【发布时间】:2011-03-28 03:01:06 【问题描述】:

该网站在各大搜索引擎的搜索结果中消失了几个月后,我终于找到了一个可能的原因。

我使用 WebBug 来调查服务器标头。查看请求是 HEAD 还是 GET 的区别。

HEAD 发送数据:

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

HEAD 收到数据:

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

GET 接收到的数据:

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 请求(至少萤火虫是这么说的)。爬虫是否可以发送 HEAD 请求?如果是这样,为什么只有这台服务器响应 403,而我正在维护的其他站点的其他服务器没有?

如果这很重要,.htaccess 中唯一的一行是(除非我的客户更改了它,因为他们不想让我访问他们的服务器)

AddType text/x-component .htc

更新 谢谢@Ryk。 FireBug 和 Fiddler 都发送 GET 请求,得到 200(或 300)个响应。正如预期的那样。所以我猜这要么是服务器设置错误(尽管这很奇怪,因为托管来自一家拥有数百万客户的大公司)或者他们放在.htaccess 中的东西。他们将不得不让我查看他们的帐户。

我的问题的第二部分是这是否可能是该网站没有出现在任何搜索引擎中的原因(site:www.attu.it 没有给出任何结果)。有什么想法吗?

更新 2 经过一番摆弄,结果发现根目录中有 phpMyAdmin robots-blocking .htaccess,这导致任何来自 robots 的请求都被发送回 403 Forbidden

【问题讨论】:

这是服务器的错误,客户端希望修复它,他们应该至少给你一些访问权限。至少,询问他们是否可以看到当前 .htaccess 的副本。 【参考方案1】:

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

Fiddler 会给你一个好主意,你也可以试试 Firefox 并安装 FireBug 插件并检查页面是否有错误。

查看该站点,我得到了 favicon.ico 的一堆 404,但除此之外,当我执行简单的 GET 请求时,我得到 200 OK,但当我执行 HEAD 时,我也得到 403。现在进入它。

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

UPDATE2:阅读此http://www.pubbs.net/200811/httpd/17210-usershttpd-how-to-reject-head-request.html 让我相信您的 Apache 服务器可以设置为拒绝 HEAD 请求。在这种情况下,它将返回 403。

【讨论】:

@mjsarfatti - 我不确定,但如果爬虫/机器人使用 HEAD 请求来爬取网站,那么是的,你会遇到问题。 我发现 curl 比 fiddler 更容易【参考方案2】:

一些管理员在httpd.conf中写道

订单拒绝,允许 全部拒绝 从 10.0 开始允许限制>

订单拒绝,允许 全部拒绝

这会对 HEAD 请求产生“禁止”。你应该检查一下。

【讨论】:

【参考方案3】:

我遇到了这个确切的问题,因为我使用的是签名 URL。

每个签名 URL 仅适用于一种方法(例如 GET 或 HEAD)。如果要使用多种方法,则必须有多个 URL。

【讨论】:

我认为这是我目前在使用 Gradle 构建时遇到的问题:***.com/questions/48253755/…。你知道如何解决这个问题吗?

以上是关于HEAD 请求在 GET “200 ok”时收到“403 禁止”?的主要内容,如果未能解决你的问题,请参考以下文章

HTTP状态码

HTTP状态码

G-WAN - 如果请求 URL = 541+ 个字符,如何返回状态码:200 OK?

JMeter POST 请求返回 200 OK 而不是 302(重定向)

实现条件-GET

HTTP状态码