婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Yii支持多域名cors原理的實現

Yii支持多域名cors原理的實現

熱門標簽:打開百度地圖標注 亳州企業外呼系統 海南外呼系統方案 兼職做地圖標注好賺錢嗎 地圖標注怎么做商戶驗證 山東電銷卡外呼系統原理是什么 400 電話 辦理 智能電銷語音機器人資訊 蘇州外呼系統有效果嗎

平常我們遇到跨域問題時,常使用 cors(Cross-origin resource sharin)方式解決。不知你是否注意到,在設置響應頭 Access-Control-Allow-Origin 域的值時,只允許設置一個域名,這意味著不能同時設置多個域名來共享資源。而在 Yii2 中直接使用'Origin' => ['http://www.site1.com', 'http://www.site2.com']的形式卻可以設置多個 cors 域名值,Why?

其實,Yii2 中采用了動態設置 Access-Control-Allow-Origin 域值的方法來解決這個問題。

說明:測試使用的接口域名api.d.fanhaobai.com,cros 多域名為www.d.yii.comwww.fq.yii.com

Nginx設置多域名

嘗試直接通過 Nginx 的add_header模塊追加 Access-Control-Allow-Origin 值實現,如下:

add_header Access-Control-Allow-Origin http://www.fq.yii.com;
add_header Access-Control-Allow-Origin http://www.d.yii.com;

接口 請求 和 響應頭 如下:

Response Headers
Access-Control-Allow-Origin: http://www.fq.yii.com
Access-Control-Allow-Origin: http://www.d.yii.com
Connection: keep-alive
Content-Type: application/json; charset=UTF-8
... ...

Request Headers
Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.8
Host: api.d.fanhaobai.com
Origin: http://www.fq.yii.com
Proxy-Connection: keep-alive
... ...

當前域為www.fq.yii.com,需跨域請求http://api.d.fanhaobai.com/v1/config/list.json的資源。瀏覽器拋出如下跨域錯誤:

XMLHttpRequest cannot load http://api.d.fanhaobai.com/v1/config/list.json. The 'Access-Control-Allow-Origin' header contains multiple values 'http://www.fq.yii.com, http://www.d.yii.com', but only one is allowed. Origin 'http://www.fq.yii.com' is therefore not allowed access.

以上信息明確說明,Access-Control-Allow-Origin 只能設置為一個值,即每次請求只能對應一個域名值。故通過該方法不能設置多域名進行 cors。

Yii2設置多域名

Yii2 設置多域名 cors,只需在對應控制器(ConfigController)中設置 cors 行為,如下:

class BaseController extends Controller
{
  /**
   * @inheritdoc
   */
  public function behaviors()
  {
    return [
      'corsFilter' => [
        'class' => \yii\filters\Cors::className(),
        'cors' => [
          //運行cors域名列表
          'Origin' => ['http://www.d.yii.com', 'http://www.fq.yii.com'],
          'Access-Control-Allow-Credentials' => true,
        ]
      ],
    ];
  }
}

重新在www.fq.yii.com發送 cors 請求,發現此時已經不存在跨域問題。響應頭 如下:

Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: http://www.fq.yii.com
Connection: keep-alive
Content-Type: application/json; charset=UTF-8
... ...

我們會發現,Access-Control-Allow-Origin 域的值為http://www.fq.yii.com,剛好為當前域名一致,且只有一個值,并未出現設置的http://www.d.yii.com值。

同時,在www.d.yii.com下發送 cors 請求,也不存在跨域問題。響應頭中 Access-Control-Allow-Origin 值為http://www.d.yii.com

由此可知,Yii2 在控制器行為中設置 Origin 項,只是一個域名白名單,而返回的 Access-Control-Allow-Origin 同請求的域名一致且在這個白名單中,這個 Access-Control-Allow-Origin 由 Yii2 根據當前請求所在域名進行了動態處理。

Yii2動態Access-Control-Allow-Origin

查看 Yii2 的\yii\filters\Cors類源碼,如下:

class Cors extends ActionFilter
{
  /**
   * @var array CORS所用的響應頭
   */
  public $cors = [
    'Origin' => ['*'],
    'Access-Control-Request-Method' => ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'],
    'Access-Control-Request-Headers' => ['*'],
    'Access-Control-Allow-Credentials' => null,
    'Access-Control-Max-Age' => 86400,
    'Access-Control-Expose-Headers' => [],
  ];
  
  /**
   * 執行action前要做的事
   * @inheritdoc
   */
  public function beforeAction($action)
  {
    $this->request = $this->request ?: Yii::$app->getRequest();
    $this->response = $this->response ?: Yii::$app->getResponse();
    ... ...
    $requestCorsHeaders = $this->extractHeaders();
    //獲取cors所用的響應頭
    $responseCorsHeaders = $this->prepareHeaders($requestCorsHeaders);
    //設置cors所用的響應頭
    $this->addCorsHeaders($this->response, $responseCorsHeaders);
    return true;
  }
  
  /**
   * 處理cors所用的響應頭,動態處理Access-Control-Allow-Origin域
   * @param array $requestHeaders CORS headers we have detected
   * @return array CORS headers ready to be sent
   */
  public function prepareHeaders($requestHeaders)
  {
    $responseHeaders = [];
    //$requestHeaders['Origin']為源地址,請求所在域名
    if (isset($requestHeaders['Origin'], $this->cors['Origin'])) {
      //源地址在白名單中,則設置Access-Control-Allow-Origin為源地址
      if (in_array('*', $this->cors['Origin']) || in_array($requestHeaders['Origin'], $this->cors['Origin'])) {
        $responseHeaders['Access-Control-Allow-Origin'] = $requestHeaders['Origin'];
      }
    }
    ... ...
   }
}

主要思想就是,查看源地址是否在 cors 白名單中,在則設置 Access-Control-Allow-Origin 域的值為源地址。這樣就能滿足 Access-Control-Allow-Origin 為一個值的限制,同時也能允許指定的域名進行 cors。

注意:使用該方法請確保 Nginx 配置中未操作 Access-Control-Allow-Origin 域。

總結

通過 Nginx 設置 Access-Control-Allow-Origin 進行 cors,有且只能有一個特定域名,局限性較大。通過代碼邏輯操作 Access-Control-Allow-Origin 來實現 cors,則比較靈活,能解決多個域名進行 cors 的需求,但是如果接口異常,跨域設置則會失效。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • Yii2實現多域名跨域同步登錄退出
  • Yii2下session跨域名共存的解決方案
  • Yii獲取當前url和域名的方法
  • YII模塊實現綁定二級域名的方法

標簽:清遠 紹興 萊蕪 綏化 溫州 安康 呼倫貝爾 金華

巨人網絡通訊聲明:本文標題《Yii支持多域名cors原理的實現》,本文關鍵詞  Yii,支持,多,域名,cors,原理,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Yii支持多域名cors原理的實現》相關的同類信息!
  • 本頁收集關于Yii支持多域名cors原理的實現的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    丝袜诱惑亚洲看片| 久久99久久久欧美国产| 婷婷一区二区三区| 成人在线一区二区三区| 精品国内片67194| 国产中文字幕精品| 日本一区二区三区国色天香 | 国产aⅴ综合色| 国产视频亚洲色图| eeuss鲁一区二区三区| 国产精品乱人伦| 97成人超碰视| 亚洲福利一区二区三区| 日韩你懂的电影在线观看| 亚洲免费在线看| 亚洲高清在线精品| 精品一区二区免费| 国产精品国产三级国产有无不卡 | voyeur盗摄精品| 亚洲精品日韩一| 欧美一区二区性放荡片| 国产麻豆日韩欧美久久| 国产视频在线观看一区二区三区| 精品综合久久久久久8888| 亚洲国产精品t66y| 欧美日韩国产片| 国产91在线看| 日欧美一区二区| 中文字幕在线观看不卡| 911精品产国品一二三产区| 国产在线视频一区二区| 亚洲精品久久7777| 久久久久久亚洲综合影院红桃| av电影在线观看不卡| 久久精品国产一区二区| 亚洲视频综合在线| 91精品国产麻豆| 91麻豆精品在线观看| 国产精品久久久久久久久果冻传媒 | 欧美人xxxx| 国产91精品精华液一区二区三区 | 欧美伊人久久大香线蕉综合69 | 欧美国产在线观看| 337p亚洲精品色噜噜| 色悠久久久久综合欧美99| 国产一区二区三区国产| 五月婷婷另类国产| 一级做a爱片久久| 国产精品高清亚洲| 欧美激情一区二区三区蜜桃视频| 欧美一区二区三区四区在线观看| 在线观看视频一区二区欧美日韩| 国产一区二区日韩精品| 老司机精品视频一区二区三区| 一区二区三区精品视频| 欧美激情一区在线| 国产欧美一区在线| 久久久久久久性| 久久亚洲精精品中文字幕早川悠里| 欧美一卡二卡在线| 日韩精品一区二区三区中文精品 | 国产日韩欧美高清| 欧美精品一区二区三区在线播放 | 久久精品国产99| 秋霞电影一区二区| 日本免费在线视频不卡一不卡二 | 成人午夜激情片| 国产成人免费视频一区| 国产美女精品人人做人人爽| 久久疯狂做爰流白浆xx| 久久国产精品99精品国产| 久久99久久99| 国产激情视频一区二区三区欧美 | 奇米色777欧美一区二区| 一区二区视频在线| 亚洲男同1069视频| 亚洲成人久久影院| 蜜桃视频免费观看一区| 国产尤物一区二区| 成人激情黄色小说| 色猫猫国产区一区二在线视频| 在线观看亚洲精品| 日韩欧美你懂的| 亚洲国产电影在线观看| 一区二区三区在线视频观看58| 污片在线观看一区二区| 精品一二三四区| 成人在线综合网| 欧美日本国产视频| 国产亚洲一区二区三区| 亚洲另类色综合网站| 日韩精品91亚洲二区在线观看 | 久久激情五月激情| 4438成人网| 久久久不卡网国产精品二区| 国产精品久久久久影院色老大| 一区二区三区精品久久久| 精品亚洲国内自在自线福利| 99久久久无码国产精品| 91精品国产一区二区三区香蕉 | 精品处破学生在线二十三| 亚洲国产精品成人综合色在线婷婷| 亚洲福利一二三区| 成人国产在线观看| 91精品国产色综合久久ai换脸| 日本一区二区久久| 美日韩黄色大片| 91丝袜高跟美女视频| 欧美成人精品高清在线播放 | 毛片一区二区三区| 一本久道中文字幕精品亚洲嫩| 日韩一区二区免费高清| 亚洲视频一区二区在线| 久久97超碰国产精品超碰| 色88888久久久久久影院野外| www亚洲一区| 樱花草国产18久久久久| 高清不卡一区二区在线| 日韩欧美自拍偷拍| 一区二区三区欧美激情| 成人av在线观| 久久蜜桃av一区精品变态类天堂| 天天做天天摸天天爽国产一区| 91在线云播放| 中文字幕一区二区三区在线观看| 日产欧产美韩系列久久99| 色播五月激情综合网| 国产精品视频一二三| 国产精品中文字幕日韩精品| 精品日韩欧美一区二区| 亚洲一二三级电影| 欧美日韩中文字幕精品| 亚洲国产成人91porn| 在线观看免费成人| 亚洲综合色婷婷| 在线免费观看一区| 亚洲无线码一区二区三区| 欧美性videosxxxxx| 亚洲电影中文字幕在线观看| 欧美最新大片在线看| 亚洲美女免费在线| 在线视频你懂得一区二区三区| 一区二区三区久久| 制服丝袜日韩国产| 日日欢夜夜爽一区| 色呦呦网站一区| 亚洲国产精品一区二区久久恐怖片 | 亚洲精品福利视频网站| voyeur盗摄精品| 洋洋成人永久网站入口| 欧美中文一区二区三区| 亚洲va欧美va天堂v国产综合| 欧美在线观看一二区| 日精品一区二区| 91精品久久久久久久91蜜桃| 久久精品国产亚洲aⅴ| 精品久久五月天| 成人精品国产免费网站| 久久精品一二三| 成人一区二区三区视频在线观看 | 国产精品天干天干在观线| 成人黄色av电影| 国产精品久久久久久妇女6080| 国产成人99久久亚洲综合精品| 精品成人免费观看| www.在线成人| 亚洲女同一区二区| 日韩一级二级三级精品视频| 蜜桃一区二区三区在线| 日韩一区二区免费高清| 国产麻豆成人传媒免费观看| 国产精品三级视频| 日本精品免费观看高清观看| 亚洲成人综合网站| 久久精品人人爽人人爽| 成人99免费视频| 婷婷亚洲久悠悠色悠在线播放| 精品成人一区二区三区四区| 成人av电影免费在线播放| 午夜精品成人在线| 中文字幕在线观看一区| 精品视频一区二区三区免费| 蜜臀精品久久久久久蜜臀| 亚洲婷婷综合久久一本伊一区| 欧美猛男gaygay网站| 91网站视频在线观看| 男女男精品视频网| 亚洲毛片av在线| 久久精品网站免费观看| 精品视频1区2区| 色哟哟精品一区| 国产一区二区不卡| 日本欧美久久久久免费播放网| 国产精品久久久久久一区二区三区| 欧美日韩精品是欧美日韩精品| 97精品超碰一区二区三区| 国产成人精品影院| 日韩中文欧美在线| 一区二区三区丝袜| 一区二区三区欧美视频|