1. 程式人生 > >Yii2.0 前後端分離 前端ajax呼叫跨域的問題

Yii2.0 前後端分離 前端ajax呼叫跨域的問題

Yii2.0有自己的一套防止跨域呼叫的機制,網上一搜一大把的解決方式,無非就是:

use yii\filters\Cors;
public function behaviors()
{
    return ArrayHelper::merge([
        [
            'class' => Cors::className(),
            'cors' => [
                'Origin' => ['http://www.myserver.net'],
                'Access-Control-Request-Method' => ['GET', 'HEAD', 'OPTIONS'],
            ],
        ],
    ], parent::behaviors());
}

  其中,把Origin改成 'Origin'=>['*'] 就可以了,但事實證明,還是不行的。

  或者改nginx伺服器的配置,增加:

 location / {             add_header Access-Control-Allow-Origin *;   }

  這樣也還是不行的~

  那為啥利用Postman或者直接網頁請求都可以,但是在html使用ajax請求遠端介面是不行的,大概原因是因為ajax的http請求型別區別於以上的請求,ajax的http請求會多一個屬性:“X-Requested-With”,瀏覽器和程式會區分到帶著個屬性的就是遠端的ajax請求,然後加以攔截(ajax會返回其建立的XMLHttpRequest物件)。

  言歸正傳,要解決Yii2.0前端ajax跨域請求問題其實也很簡單,在專案的入口檔案index.php或者在config的main.php加上以下幾句話即可;

header("Access-Control-Allow-Origin: *"); header('Access-Control-Allow-Headers:Authorization'); header("Access-Control-Allow-Methods: GET, POST, DELETE"); header("Access-Control-Allow-Credentials: true"); header("Access-Control-Allow-Headers: Content-Type, X-Requested-With

, Cache-Control,Authorization,Beeba-Sign,Beeba-Timestamp");(後面兩個引數是簽名和時間戳,可以忽略)

親測可用;

以上是我的分享,如有不到位敬請諒解!