HEAD 和 GET http 请求对同一 URL 返回不同的状态代码

Val*_*kea 5 python http-status-codes httplib2 python-requests

我正在尝试检查存储在数据库中的某些 URL 是否仍然是有效链接。为了实现这一点,我使用 httplib2 来请求 HEAD 状态,以避免下载页面的全部内容。我对结果非常满意。

但后来我发现在某些情况下,使用 HEAD 请求返回的状态代码与使用 GET 请求返回的状态代码并不相似。

因此,为了防止库中出现错误,我使用不同的库进行了一些测试(下面是我的“请求”库测试):

> import requests    

> rg = requests.get("https://fr.news.yahoo.com/chemin-dames-l-hommage-personnel-pr%C3%A9sident-121005844.html")
> rh = requests.head("https://fr.news.yahoo.com/chemin-dames-l-hommage-personnel-pr%C3%A9sident-121005844.html")

> print("GET status code:", rg.status_code)
  ('GET status code:', 200)

> print("HEAD status code:", rh.status_code)
  ('HEAD status code:', 404) 
Run Code Online (Sandbox Code Playgroud)

但无论我使用什么库,对于同一个 URL,我仍然有不同的 GET & HEAD 状态。

因此,显然站点维护者决定不为 HEAD 和 GET 请求返回相同的状态代码......即使不推荐,这似乎也是合法的。

有没有一种方法可以避免此问题,并且仍然知道链接是否有效,而无需下载我需要验证的近 200 万个网址的全部内容?

每当 HEAD 请求返回 >400 状态代码时,我都可以仔细检查 GET 请求,但这对我来说似乎是一项肮脏的工作。

red*_*Fur 5

看来你可能必须用 GET 方式来做。虽然当页面处于活动状态时 HEAD应该返回 200,但根本无法保证这一点,并且取决于服务器如何实现它。另外,有些人会认为 HEAD 请求应该返回 404。规范只是简单地描述了 404:

当服务器不希望准确揭示请求被拒绝的原因时,通常使用此状态代码

您还应该考虑服务器实现中可能出现的所有错误和错误。一个简单的谷歌搜索就会告诉你有多少这样的错误。HEAD 很可能返回 200,但 GET 是 404,因此您建议的双重检查HEAD 404 的方法和 GET 请求也不会 100% 可靠。