Здравствуйте. Есть задача забрать 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: *'); } Помогите исправить эту ошибку.
Оно там лишнее. Этот заголовок должен отдавать сервер. А вы должны передавать "Origin". И нюанс: если у вас Content-Type не "application/x-www-form-urlencoded","multipart/form-data", text/plain", то запрос считается сложным и проходит в два этапа. Сначала браузер отправляет OPTIONS, а только потом уже GET/POST. И вот уже в ответ на OPTIONS должен быть "Access-Control-Allow-Origin: *".
Так... В приложении хром я переделал так Код: xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); значит теперь передается сразу Post. А в принимающей функции оставил Код: $this->response->addHeader('Access-Control-Allow-Origin: *'); ошибка осталась
штука эта называется CORS. потестить и посмотреть как она работает и какие заголовки шлются в запросе и возвращаются в реквесте можно тут: https://www.test-cors.org/
Я нашел ответ всему этому. В .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>