@Galdar
Web, JS, PHP, NGINX, Linux

Как устанить ошибку CORS?

Вот скрипт JS
JS
var xhr = new XMLHttpRequest();

      var json = JSON.stringify(data);

      xhr.withCredentials = true;

      xhr.open('POST', 'https://dev.dev.ru/server/', true);
      
      xhr.setRequestHeader('Access-Control-Allow-Origin', "https://login.domain.ru/");
      xhr.setRequestHeader('Access-Control-Allow-Headers', 'origin, content-type, accept');
      xhr.setRequestHeader('Content-type', 'application/json; charset=utf-8');

      xhr.onreadystatechange = function() {
        if (this.readyState != 4) return;
      
        console.log( this.responseText );

        callback( this.responseText )
      }

      xhr.send(json);


Вот конфиг NGINX он установлен в location /server/
NGINX

if ($request_method = 'OPTIONS') {

      add_header 'Access-Control-Allow-Origin' "https://login.domain.ru/";
      
      #
      # Om nom nom cookies
      #

      add_header 'Access-Control-Allow-Credentials' 'true';
      add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
      
      #
      # Custom headers and headers various browsers *should* be OK with but aren't
      #

      add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
      
      #
      # Tell client that this pre-flight info is valid for 20 days
      #

      add_header 'Access-Control-Max-Age' 1728000;
      add_header 'Content-Type' 'text/plain charset=UTF-8';
      add_header 'Content-Length' 0;

      return 204;
    }

    if ($request_method = 'POST') {

      add_header 'Access-Control-Allow-Origin' "https://login.domain.ru/";
      add_header 'Access-Control-Allow-Credentials' 'true';
      add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
      add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';

    }

    if ($request_method = 'GET') {

      add_header 'Access-Control-Allow-Origin' "https://login.domain.ru/";
      add_header 'Access-Control-Allow-Credentials' 'true';
      add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
      add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';

    }



Пишет ошибку что (Запрос из постороннего источника заблокирован: Политика одного источника запрещает чтение удаленного ресурса на https://dev.dev.ru/server/. (Причина: заголовок CORS «Access-Control-Allow-Origin» не совпадает с «https://login.domain.ru/»).)

Что я неправильно делаю?
  • Вопрос задан
  • 172 просмотра
Решения вопроса 2
SagePtr
@SagePtr
Еда - это святое
Оригин без слэша в конце пишется, возможно, из-за него несовпадение
Ответ написан
@Galdar Автор вопроса
Web, JS, PHP, NGINX, Linux
Разместил вне всех location
add_header 'Access-Control-Allow-Origin' 'https://domain.ru';
   add_header 'Access-Control-Allow-Credentials' 'true';
   add_header 'Access-Control-Allow-Headers' 'Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken';
   add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';


Доп инфа, которая была очень полезна:
https://webdevblog.ru/chto-takoe-cors/
https://techfeed.net/240446/
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@FireGM
Лучше всего почитать про CORS. Если не знать что делаешь, то это может создать огромную дыру, через которую можно будет делать много плохого.
Но если вы хотите просто попробовать, то добавить заголовки для https://dev.dev.ru.
add_header 'Access-Control-Allow-Origin' "https://dev.dev.ru"
Ответ написан
Bavashi
@Bavashi
XMLHttpRequest - этот объект не даст вам совершить запрос, если источники будут отличаться. То есть, если сайт был загружен с домена X, то на домена Y вы сделать запрос через этот объект не сможете.
Можете попробовать так: оборачивать ваши данные в формате json в функцию обратного вызова и использовать JSONP. То есть делаете инъекцию в dom-модель браузера путем вставки тега script и получаете свои данные, которые можете, например, распарсить в объект через JSON.parse(). Пример инъекции:
let src = "http://yourServerName.com/yourRequest/request?jsonp=parseResponse";
function clickButton() {
  var domElem = document.createElement("script");
  domElem.src = src;
  document.head.appendChild(domElem);
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы