Ответ на предполетный запрос не проходит проверку контроля доступа (JavaScript) - PullRequest
0 голосов
/ 05 ноября 2018

Я пытаюсь сделать пост-вызов, используя XMLHTTPRequest, и получаю следующее сообщение:

Доступ к XMLHttpRequest по адресу 'https://some -линк ' от источника 'NULL' был заблокирован политикой CORS: Ответ на предполётный запрос не проходит проверку контроля доступа: нет «Access-Control-Allow-Origin» заголовок присутствует на запрашиваемом ресурсе.

Существуют аналогичные темы, в которых говорится, что нужно либо добавить заголовок CORS, в котором я уже сделал.

Что мне интересно, так это то, что эти точно такие же коды, когда они превращаются в AJAX, работают нормально (без необходимости, чтобы другие проходили конфигурацию CORS). Поскольку AJAX просто является платформой, построенной на JavaScript, почему это сообщение отображается при кодировании без AJAX и исключительно из JavaScript?

var xhr = new XMLHttpRequest()
xhr.open('POST', url, true)
xhr.send(data)

против

$.ajax({
    type: 'POST',
    url: 'url',
    data: data
});

Последний работает отлично. Какая дополнительная / скрытая реализация есть в ajax?

1 Ответ

0 голосов
/ 05 февраля 2019

Откройте DOM Inspector, нажмите на запрос и найдите разницу между этими двумя запросами. Там будет разница.

Вероятно, это "нулевое" происхождение, потому что вы используете IFRAME с атрибутом sandbox, верно? Для решения этой проблемы необходимо убедиться, что

  • Запрашиваемый ресурс (на сетевой панели) возвращает «Access-Control-Allow-Origin» среди заголовков RESPONSE (вы сказали, что это сделали)
  • Имейте в виду, что при предварительных проверках используются запросы OPTIONS (ни GET, ни POST), поэтому убедитесь, что ваш сервер отправляет вышеупомянутый заголовок, когда ресурсы запрашиваются с использованием запроса OPTIONS. В этом случае вы должны увидеть сообщение об ошибке запроса OPTIONS в консоли прямо перед ошибкой CORS. (Например, NGINX отвечает по умолчанию с ошибкой 405 на запросы OPTIONS.)

Вы можете проверить это с помощью командной строки curl curl 'https://www.example.com/my-url-that-fails-here/' -X OPTIONS -H 'Pragma: no-cache' -H 'Access-Control-Request-Method: GET' -H 'Origin: null' -H 'Accept-Encoding: gzip, deflate, br' -H 'Accept-Language: en-US,en' -H 'User-Agent: Mozilla/5.0' -H 'Accept: */*' -H 'Access-Control-Request-Headers: x-requested-with' --compressed -D - -O /dev/null Это должно очень близко имитировать настоящий браузер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...