Кроссдоменные куки можно установить с помощью AJAX-запроса.
Для этого используем CORS.
Пример для Yii2:
<?php
namespace frontend\controllers;
use yii\web\Response;
use Yii;
use app\components\MyUtility;
use yii\web\Controller;
class CoolController extends Controller
{
// Отключаем CSRF для контроллера.
// Кроссдоменный запрос работает только без CSRF.
public $enableCsrfValidation = false;
public function behaviors()
{
// Включаем CORS для контроллера.
return [
'corsFilter' => [
'class' => \yii\filters\Cors::className(),
'cors' => [
// Разрешаем доступ с указанных доменов.
'Origin' => ['http://site1.com', 'http://site2.com'],
'Access-Control-Allow-Origin' => true,
// Куки от кроссдоменного запроса
// будут установлены браузером только при заголовке
// "Access-Control-Allow-Credentials".
'Access-Control-Allow-Credentials' => true,
// Разрешаем только метод POST.
'Access-Control-Request-Method' => ['POST'],
],
],
];
}
public function actionSelect()
{
Yii::$app->response->format = Response::FORMAT_JSON;
return MyUtility::processPostParamsAndSetCookie(Yii::$app->request->post());
}
}
Для этого используем CORS.
Пример для Yii2:
<?php
namespace frontend\controllers;
use yii\web\Response;
use Yii;
use app\components\MyUtility;
use yii\web\Controller;
class CoolController extends Controller
{
// Отключаем CSRF для контроллера.
// Кроссдоменный запрос работает только без CSRF.
public $enableCsrfValidation = false;
public function behaviors()
{
// Включаем CORS для контроллера.
return [
'corsFilter' => [
'class' => \yii\filters\Cors::className(),
'cors' => [
// Разрешаем доступ с указанных доменов.
'Origin' => ['http://site1.com', 'http://site2.com'],
'Access-Control-Allow-Origin' => true,
// Куки от кроссдоменного запроса
// будут установлены браузером только при заголовке
// "Access-Control-Allow-Credentials".
'Access-Control-Allow-Credentials' => true,
// Разрешаем только метод POST.
'Access-Control-Request-Method' => ['POST'],
],
],
];
}
public function actionSelect()
{
Yii::$app->response->format = Response::FORMAT_JSON;
return MyUtility::processPostParamsAndSetCookie(Yii::$app->request->post());
}
}
Код JQuery:
$.ajax('http://site.com/set-global-cookie', {
type : 'POST',
data : {veryImportantData: someInformation},
success : function (response) {
if (response.status !== 'success') {
if (response.status === 'error') {
console.error('Возникла ошибка: ' + response.message);
} else {
console.error('Возникла неизвестная ошибка.');
}
}
},
error : function(xhr, str){
console.error('Возникла ошибка AJAX: ' + xhr.responseCode + ', "' + str + '"');
},
xhrFields: {
// Необходимо для установки куков.
withCredentials: true
},
});