Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

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


Recommended Posts

Приветствую форумчане. Такая проблема, пытаюсь выполнить 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 weeks later...

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

Надіслати
Поділитися на інших сайтах


Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.