Почему полезно конвертировать 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", адаптер не должен отправлять ответ клиенту."

Другие вопросы по тегам