Я пытаюсь отправить запрос AJAX GET из субдомена в основной домен. Ниже мой код AJAX.
$.get('http://my-yii2-website.com/controller/test-method',
{data: '1')},
function(returnedData){
alert(returnedData);
},
'json'
);
Этот код выше находится в поддомене. В основной области у меня есть контроллер и метод действия, который выглядит следующим образом.
public function behaviors()
{
$subDomain = 'http://subdomain.my-yii2-website.com';
return [
'corsFilter' => [
'class' => \yii\filters\Cors::className(),
'cors' => [
'Origin' => [$subDomain, ],
'Access-Control-Request-Method' => ['GET', ],
'Access-Control-Request-Headers' => ['*'],
'Access-Control-Allow-Credentials' => null,
'Access-Control-Max-Age' => 3600,
],
],
];
}
public function actionTestMethod()
{
$request = Yii::$app->request;
if($request->isAjax)
{
return json_encode('OK!');
}
else
{
return json_encode('ERROR');
}
}
Это работает. Но из-за оператора if в actionTestMethod () он не видит запрос как запрос AJAX. Возвращает предопределенное сообщение «ОШИБКА». Я работаю с Yii Framework 2.0.
isAjax
тесты на наличие X-Requested-With
заголовок при условии, что любой, кто делает запрос Ajax, установит этот (нестандартный) заголовок.
jQuery установит его по умолчанию для тех же самых запросов на источник. Он не будет установлен для перекрестных запросов (поскольку он нестандартный, обычные настройки CORS отклонят его).
Либо установите его явно, либо используйте другой метод, чтобы определить, является ли запрос ajax или нет.
(Обратите внимание, что, как правило, «is ajax» является плохим тестом, «хотел бы, чтобы JSON вместо HTML» обычно был лучшим тестом, и его можно отключить заголовок Accept)
Других решений пока нет …