No 'Access-Control-Allow-Origin' header is present on the requested resource.

Тема в разделе "PHP", создана пользователем Zalom, 27 мар 2019.

  1. Zalom

    Zalom

    Регистрация:
    18 мар 2017
    Сообщения:
    37
    Симпатии:
    1
    Здравствуйте. Есть задача забрать html-код со страниц сторонних сайтов и производить некоторые действия. Для этого сделали приложение для chome. Оно должно передавать результат в функцию. Так вот передавать не получается. Появляется ошибка.
    Код:
    Access to XMLHttpRequest at 'https://site.ru/admin/index.php?route=papka/papka_project_form/NewFunction' from origin 'chrome-extension://neblljoondlhojngpajkcnoofdmacgci' 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.
    
    Cross-Origin Read Blocking (CORB) blocked cross-origin response https://site.ru/admin/index.php?route=papka/papka_project_form/NewFunction with MIME type text/html. See https://www.chromestatus.com/feature/5629709824032768 for more details.
    
     XHR finished loading: OPTIONS "https://site.ru/admin/index.php?route=papka/papka_project_form/NewFunction".
    
    Я понимаю, что нужны правильные заголовки.
    Я их вставил в свое приложение chrome
    Код:
    function text123(str,url){
    for(var i=0;i<str.length;i++){
        var array_url=url.split('#');
        var xhr = new XMLHttpRequest();
        const txt="txt="+encodeURIComponent(str[i].innerHTML);
        xhr.open("POST", "https://site.ru/admin/index.php?route=papka/papka_project_form/NewFunction", true);
        xhr.setRequestHeader('Access-Control-Allow-Origin', '*');
        xhr.onreadystatechange = function() {
          if (xhr.readyState == 4){
          }
        }
        xhr.send(txt);
    }   
    }
    var html=document.getElementsByTagName('html');
    var url1=window.location.href;
     text123(html,url1);
    
    Вставил в принимающую функцию. Предполагается что функция ничего не возвращает.
    Код:
    public function NewFunction(){
          //здесь какие то действия с полученными данными
          $this->response->addHeader('Access-Control-Allow-Origin: *');
        }
    
    Помогите исправить эту ошибку.
     
  2. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Оно там лишнее. Этот заголовок должен отдавать сервер. А вы должны передавать "Origin".
    И нюанс: если у вас Content-Type не "application/x-www-form-urlencoded","multipart/form-data", text/plain", то запрос считается сложным и проходит в два этапа. Сначала браузер отправляет OPTIONS, а только потом уже GET/POST. И вот уже в ответ на OPTIONS должен быть "Access-Control-Allow-Origin: *".
     
  3. Zalom

    Zalom

    Регистрация:
    18 мар 2017
    Сообщения:
    37
    Симпатии:
    1
    Так...
    В приложении хром я переделал так
    Код:
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    
    значит теперь передается сразу Post.
    А в принимающей функции оставил
    Код:
    $this->response->addHeader('Access-Control-Allow-Origin: *');
    
    ошибка осталась
     
  4. $iD

    $iD Команда форума

    Регистрация:
    13 мар 2012
    Сообщения:
    3.581
    Симпатии:
    1.482
    штука эта называется CORS. потестить и посмотреть как она работает и какие заголовки шлются в запросе и возвращаются в реквесте можно тут: https://www.test-cors.org/
     
  5. Zalom

    Zalom

    Регистрация:
    18 мар 2017
    Сообщения:
    37
    Симпатии:
    1
    Я нашел ответ всему этому. В .htaccess добавить
    Код:
    <ifmodule mod_headers.c>
      Header always set Access-Control-Allow-Origin: "*"
      Header always set Access-Control-Allow-Methods "POST, GET, PUT, DELETE, OPTIONS"
      Header always set Access-Control-Allow-Headers "X-Requested-With, content-type"
    </ifModule>