Yii Framework 2.0从子域向主域发送ajax get请求

时间:2015-01-05 10:09:59

标签: php ajax subdomain yii2 cross-site

我尝试从子域向主域发送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');
    }
}

确实有效。但由于actionTestMethod()中的if语句,它不会将请求视为AJAX请求。它返回预定义的错误'信息。我正在使用Yii framework 2.0。

1 个答案:

答案 0 :(得分:0)

isAjax测试是否存在X-Requested-With标头,假设任何发出Ajax请求的人都会设置该(非标准)标头。

jQuery将默认为相同的原始请求设置它。它不会为交叉原始请求设置它(因为它是非标准的,正常的CORS设置会拒绝它)。

显式设置或使用其他方法确定请求是否为ajax。

(注意,一般情况下,"是ajax"是一个糟糕的测试,"想要JSON而不是HTML"通常是一个更好的测试,你可以关闭它{{ 3}})