Для чего нужен HTTP метод OPTIONS?
Что проверяют
Понимаете ли вы, откуда берётся лишний запрос в панели разработчика перед вашим POST, и умеете ли объяснять ошибки CORS.
Как отвечать
OPTIONS спрашивает у сервера, что он позволяет делать с ресурсом. Формально ответ содержит заголовок Allow со списком методов, но на практике метод почти целиком живёт в другом сценарии: это предварительный запрос CORS.
Браузер отправляет его сам, перед основным запросом, когда запрос считается непростым. Непростым он становится, если метод не GET, HEAD или POST, если задан нестандартный заголовок (Authorization, свой X-...) или если у POST тип содержимого не из списка простых (например, application/json).
В предварительном запросе браузер сообщает Access-Control-Request-Method и Access-Control-Request-Headers, а сервер обязан ответить:
Access-Control-Allow-Originс источником или звёздочкой;Access-Control-Allow-MethodsиAccess-Control-Allow-Headers;Access-Control-Allow-Credentials: true, если нужны куки, и тогда звёздочка в источнике уже недопустима;Access-Control-Max-Age, чтобы браузер закешировал разрешение и не спрашивал перед каждым запросом.
Практические следствия: предварительный запрос это дополнительный круг по сети, и на медленной связи он заметен, поэтому Max-Age стоит выставлять осознанно; сервер должен отвечать на OPTIONS без авторизации, иначе браузер получит 401 и основной запрос не уйдёт вовсе; ошибка CORS это ответ сервера, а не запрет браузера «просто так», и чинится она на сервере.
Где спотыкаются
Ищут ошибку CORS в клиентском коде и пытаются лечить её заголовками в запросе.
Закрывают OPTIONS авторизацией и получают отказ до основного запроса.
Ставят звёздочку в источнике вместе с передачей кук и не понимают, почему браузер отвергает ответ.