Зачем вам нужно различать GET и HEAD?
Обычно вы не должны различать и должны обрабатывать запрос HEAD точно так же, как GET. Это связано с тем, что запрос HEAD предназначен для возврата тех же заголовков, что и GET. Разница лишь в том, что не будет содержания ответа. Тот факт, что содержание ответа отсутствует, не означает, что вам больше не нужно возвращать действительный заголовок Content-Length или другие заголовки, которые зависят от содержимого ответа.
В mod_wsgi, на который на вас указывают разные люди, он в некоторых случаях намеренно меняет метод запроса с HEAD на GET, чтобы защититься от людей, которые по-разному относятся к HEAD. Конкретный случай, когда это делается, - это когда выходной фильтр Apache зарегистрирован. Причина, по которой это делается в этом случае, заключается в том, что выходной фильтр может ожидать увидеть содержимое ответа и из этого генерировать дополнительные заголовки ответа. Если вы решили отказаться от генерации какого-либо содержимого ответа на запрос HEAD, вы лишите выходной фильтр содержимого, и добавленные ими заголовки могут не согласиться с тем, что будет возвращено из запроса GET. Конечным результатом этого является то, что вы можете заполнить кэши и работу браузера.
То же самое может применяться в равной степени к CGI-сценариям за Apache, так как в этом случае также могут быть добавлены выходные фильтры. Однако для сценариев CGI нет ничего, что могло бы защитить от глупости пользователей и того, что они поступают иначе для запроса HEAD.