В моем приложении необходимо реализовать различную логику для GET и HEAD запросов. По HEAD внешняя система должна получить 200 или 404 в зависимости от существования документа. Если документ существует, то внешняя система перенаправляет пользователя по тому же адресу, где уже открывается полноценная страница с авторизацией и т.д.
Но, как оказалось, в symfony запросы HEAD заменяются на GET Unacessible routes in prod because HEAD request becomes GET #21074
Т.е. при запросе HEAD в контроллере:
class MyController extends AbstractController
{
/**
* @Route("/document/{id}", methods={"GET"}, requirements={"id"="\d+"})
* @return Response
*/
public function getAction(string $id): Response
{
return $this->render('default/index.html.twig');
}
/**
* @Route("/document/{id}", methods={"HEAD"}, requirements={"id"="\d+"})
* @return Response
*/
public function headAction(string $id): Response
{
return new Response('', Response::HTTP_NOT_FOUND);
}
}
выполнится getAction. Можно ли изменить такое поведение в конфигурации? Иначе в голову ничего не приходит кроме проверки REQUEST_METHOD:
/**
* @Route("/cabinet/{id}", methods={"GET"}, requirements={"id"="\d+"})
* @param string $id
* @param Request $request
* @return Response
*/
public function getAction(string $id, Request $request): Response
{
if($request->server->getAlpha('REQUEST_METHOD') === 'HEAD') {
return new Response('', Response::HTTP_NOT_FOUND);
}
return $this->render('default/index.html.twig');
}
Если коротко, то нельзя разделить.
Symfony исходят из RFC7231
Метод HEAD идентичен GET за исключением того, что сервер НЕ ОТПРАВЛЯЕТ тело сообщения в ответе.
HEAD может повлиять на ранее кэшированные GET-ответы RFC7234 (тут описан механизм Freshening Responses для HEAD).
Этот вопрос поднимался несколько раз (раз, два, три, четыре) и так и заглох как я понял.
Думаю, можно попробовать вытащить метод из $this->context->getMethod()
Ну и соответсвенно изменить контроллер
/**
* @Route("/cabinet/{id}", methods={"GET", "HEAD"}, requirements={"id"="\d+"})
* @param string $id
* @param Request $request
* @return Response
*/
public function getAction(string $id, Request $request): Response
{
if($this->context->getMethod() === 'HEAD') {
return new Response('', Response::HTTP_NOT_FOUND);
}
return $this->render('default/index.html.twig');
}
Продвижение своими сайтами как стратегия роста и независимости