За последние 24 часа нас посетили 18854 программиста и 1602 робота. Сейчас ищут 1008 программистов ...

Реш. fetch() POST has been blocked by CORS policy: Response to preflight request doesn't pass access

Тема в разделе "Решения, алгоритмы", создана пользователем [vs], 30 окт 2020.

Метки:
  1. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.557
    Симпатии:
    631
    Элементарное решение надоедливой ошибки CORS при попытке отправить JSON методом POST используя fetch:

    Access to fetch at https://your-site from origin 'http://localhost' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

    Ошибка возникает потому, что браузер обязательно делает запрос методом OPTIONS прежде чем послать POST. Наш php скрипт обрабатывает его как GET и выдает всякую муть или ошибку.

    А вместо этого, нужно всего-навсего послать требуемые заголовки и убить скрипт:

    PHP:
    1. if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    2.     header("Access-Control-Allow-Origin: *");
    3.     header('Access-Control-Allow-Headers: Content-Type");
    4.    exit();
    5. }
    Всё. На первый раз OPTIONS получают корректный ответ, на второй - получим наш JSON.
    Не забываем mode: cors в fetch конечно же.
     
    lastdays нравится это.
  2. villiwalla

    villiwalla Активный пользователь

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70