В зависимости от используемых библиотек и технологий обработчик HEAD может быть необходимо ещё и явным образом надо написать. Поэтому нет ничего удивительного, что сервер и не обязан возвращать одинаково.
Например, вот у меня есть сто лет назад написанный скрипт на базе библиотеки BaseHTTPServer:
def do_GET(self):
url = self.path
for mm in self.methodmap.keys():
if re.match(mm, url):
return self.methodmap[mm](url, None)
self.send_response(404)
self.send_header('Content-Type', 'text/plain')
self.end_headers()
self.wfile.write('URL not defined')
def do_HEAD(self):
self.send_response(200)
self.send_header('Content-type', 'application/json')
self.end_headers()
Здесь HEAD всегда будет возвращать 200, даже на кривые URL, в то время как GET может возвращать 404. Потому что писать красиво для HEAD мне не было никакой потребности, и я просто оставил тот вариант, который был в шаблоне скрипта по умолчанию.