Почему полезно конвертировать HEAD-запросы в GET-запросы?
В новом приложении Феникс Plug.Head
Плагин присутствует по умолчанию, и я был заинтригован о его значении.
Я знаю, что " метод HEAD идентичен GET, за исключением того, что сервер НЕ ДОЛЖЕН отправлять тело сообщения в ответе ".
Я думаю, что официальные руководства Феникса - первоклассные, но это оттолкнуло меня в руководстве по маршрутизации:
Plug.Head - преобразует запросы HEAD в запросы GET и удаляет тело ответа.
Если запросы HEAD без тела, то зачем это нужно? Я подумал, может быть, обуздать неправильно сформированные запросы, но, глядя на реализацию Plug.Head, он просто переключает метод HEAD на GET.
def call(%Conn{method: "HEAD"} = conn, []), do: %{conn | method: "GET"}
def call(conn, []), do: conn
end
Самая близкая вещь, которую я смог найти в этой теме, это вопрос о ServerFault, но он был связан с NGINX и ошибочной логикой приложения, где запросы HEAD нужно было преобразовывать в GET, а соответствующие ответы GET обратно в HEAD.
2 ответа
Поскольку Феникс в значительной степени вдохновлен Rails, вы можете смело ставить Plug.Head
вдохновленRack::Head
,
Запрос HEAD возвращает тот же ответ, что и GET, но только с заголовками. Таким образом, для получения правильных заголовков они направляются на действия GET в вашем приложении Phoenix.
Однако, чтобы получить правильное (пустое) тело, тело ответа должно быть удалено. Так какRack::Head
это промежуточное ПО, оно делает это после того, как получает ответ от контроллеров.
Напротив, архитектура Plug работает больше как конвейер,Plug.Head
модифицирует метод и передаетconn
вместе, но никогда не увидит это снова.
Если вы видите ответ cdegroot, ответственность за удаление тела ответа переходит к Plug.Conn.Adapter
реализовать (т.е. веб-сервер).
AFAICT, идея в том, что Plug.Head
просто гарантирует, что запрос обрабатывается как GET
; вторая часть реализации HEAD
, который не отправляет тело, выполняется адаптерами штекерного соединения. В документации для большинства обратных вызовов, таких как send_resp, указывается, что "если в запросе есть метод "HEAD"
, адаптер не должен отправлять ответ клиенту."