Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...

Ajax запрос между разными доменами как настроить правильный ответ сервера?


Рекомендованные сообщения

Приветствую форумчане. Такая проблема, пытаюсь выполнить ajax запрос, суть которого отправить некоторые данные с домена: a.com на b.com и соответственно получить ответ от b.com с целью дальнейшей его обработки в скрипте на a.com

Оба домена находятся на OpenServer на локальной машине, то есть у меня есть контроль над http://b.com/ и я могу прописать в php файле необходимые настройки.
Однако при попытке выполнить ajax запрос получаю ошибку:

jquery-3.6.0.min.js:2 Cross-Origin Read Blocking (CORB) blocked cross-origin response http://b.com/?callback=jQuery360001053556176974424_1630579545897&_=1630579545898 with MIME type application/json. See https://www.chromestatus.com/feature/5629709824032768 for more details.
 

Аналогичную ситуацию имею на хостинге уже на реальных доменах. 
При этом данные c a.com на b.com в php скрипт все же попадают, однако, мне не удается добиться чтения ответа на домене a.com.

Что характерно в сети есть по меньшей мере один домен с которого таки удается получить данные таким способом.
Если вместо b.com подставить страницу:
https://jsonplaceholder.typicode.com/todos/1
то в этом случае получаю ответ:
{userId: 1, id: 1, title: "delectus aut autem", completed: false}
Однако же добиться аналогичного эффекта на домене под собственным контролем я не могу.
 

Пробовал в js указывать crossDomain: true, на стороне php пробовал указывать различные заголовки по типу:

header('content-type: application/json');


и тому подобное... пробовал даже скопировать из браузера заголовки которые отдает
сайт https://jsonplaceholder.typicode.com/todos/1 и подставить их в php файл через тот же header() однако ничего не выходит.

Подскажите куда копать? Вопрос вроде плевый, но сколько не пытаюсь ничего не получается.

Ниже код js:

 

<script>
//Первый вариант на jQuery:

$(document).ready(function(){

	$.ajax({
    url: "http://b.com",
    crossDomain: true,
    dataType: "jsonp",
	    success: function( response ) {
	      console.log(response);
	    }
  });

});
</script>


<script>
	//Второй вариант на чистом js:
	
    function receiver(data){
        console.log(data);
    }
</script>
<script src="http://b.com/?callback=receiver"></script>

код php:

 

<?php

   header('content-type: application/json');
   header('Access-Control-Allow-Origin: http://a.com');
   header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE');

	echo '{"foo":"bar"}';
?>

 

Изменено пользователем kairos
Ссылка на комментарий
Поделиться на других сайтах


В общем следующий код на локальной машине отдает данные нормально:

$(document).ready(function(){
 
    $.ajax({
    url: "http://b.com",
    crossDomain: true,
        success: function( response ) {
          console.log(response);
        }
  });
 
});


 

<?php

	 header('content-type: application/json');
   header('Access-Control-Allow-Origin: http://a.com');

	echo '{"foo":"bar"}';
?>

 

То есть на локалке достаточно было убрать: dataType: "jsonp", однако на виртуальном хостинге этот код не работает, видимо блокировка идет где то на уровне настроек хостинга, интересно можно ли это решить средствами php или скажем путем добавления файла: .htaccess или тут без обращения в саппорт хостинга не обойтись? 

Изменено пользователем kairos
Ссылка на комментарий
Поделиться на других сайтах


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

На проблемном хостинге помог файл: .htaccess со следующим содержимым:
 

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    <IfModule mod_headers.c>
    Header always set Access-Control-Allow-Origin "https://b.com"
    Header always set Access-Control-Allow-Methods "GET,POST,PATCH,PUT,DELETE,OPTIONS"
    Header always set Access-Control-Allow-Headers "*"
    Header always set Access-Control-Allow-Credentials "*"
    Header set Access-Control-Allow-Credentials true
  </IfModule>
</IfModule>


При этом аналогичные запросы из php  файла пришлось убрать, итоговый код:

PHP:

 

<?php
header('content-type: application/json');

echo '{"foo":"bar"}';

  file_put_contents(__DIR__ . '/test_GET_data.txt', var_export($_GET, true));
  file_put_contents(__DIR__ . '/test_POST_data.txt', var_export($_POST, true));
?>

 

JS:

 

$(document).ready(function(){
                  $.ajax({
                    url: "https://b.com/",
                    crossDomain: true,
                      success: function( response ) {
                        console.log(response);
                      }
                  });
                });

 

Изменено пользователем kairos
  • +1 1
Ссылка на комментарий
Поделиться на других сайтах


  • 2 недели спустя...

На самом деле на хостинге настроено все правильно. Корс это политика безопасности которая не позволяет вашей сессии посылать на левые ресурсы запросы, xss.  3 строки в индекс добавить.

Ссылка на комментарий
Поделиться на других сайтах


Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас
 Поделиться

×
×
  • Создать...

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.