HEAD 和 GET http 请求 return 相同 URL 的不同状态代码

HEAD and GET http request return different status code for the same URL

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

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

所以,为了防止库中出现错误,我用不同的库做了一些测试(下面是我的 "requests" 库测试):

> 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) 

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

所以,显然网站维护者决定不 return HEAD 和 GET 请求的相同状态代码...即使不推荐,这似乎也是合法的。

有没有办法避免这个问题并且仍然知道 link 是否有效,而不必下载我需要验证的将近 200 万 url 的全部内容?

只要在 HEAD 请求上 return 编辑了 >400 状态代码,我就可以使用 GET 请求仔细检查,但这对我来说似乎是一项肮脏的工作。

看来您可能必须以 GET 方式进行。虽然 HEAD should return 200 当页面处于活动状态时,根本无法保证这一点,并且取决于服务器如何实现它。此外,有些人会争辩说 HEAD 请求应该 return 404。规范简单地说明了 404:

This status code is commonly used when the server does not wish to reveal exactly why the request has been refused

您还应该考虑服务器实施中可能出现的所有错误和失误。一个简单的 google 搜索将显示有多少此类错误。很可能是 HEAD returns 200,但 GET 是 404,所以你建议的双重检查方法 only HEAD 404s,GET 请求不会 100% 可靠也是。