laravel 5.5 跨域問題解決方案


一、laravel-Cors

  1. 安裝

在終端執行安裝命令如下:

composer require barryvdh/laravel-cors
  1. 添加服務提供商

在Laravel配置文件app.phpproviders數組中添加如下配置:

Barryvdh\Cors\ServiceProvider::class,
  1. 發布配置文件

執行在終端執行發布配置文件命令如下:

php artisan vendor:publish --provider="Barryvdh\Cors\ServiceProvider" 

執行后會在laravel目錄下的config目錄中新增cors.php配置文件,如下圖

 
 

至此laravel-Cors安裝完成。

備注

  • 什么是跨域

跨域是指從一個域名的網頁去請求另一個域名的資源。比如從www.baidu.com 頁面去請求 www.google.com 的資源。跨域的嚴格一點的定義是:只要 協議,域名,端口有任何一個的不同,就被當作是跨域

  • 為什么瀏覽器要限制跨域訪問

原因就是安全問題:如果一個網頁可以隨意地訪問另外一個網站的資源,那么就有可能在客戶完全不知情的情況下出現安全問題。

  • 為什么要跨域

既然有安全問題,那為什么又要跨域呢? 有時公司內部有多個不同的子域,比如一個是b.a.com ,而應用是放在c.a.com , 這時想從b.a.com去訪問 location.company.com 的資源就屬於跨域。

  • 如何解決跨域問題

跨域訪問需要用到兩樣東東,一個是JSON,一種基於文本的傳輸協議;一種是JSONP,一群碼農想出來的跨域解決方案。

  • 服務端需要做的

服務端要檢查訪問的請求參數,如果沒有callback,則可以按照之前的流程走;如果帶着callback參數,則需要將返回的結果包裝在callback里面。

  • 客戶端(瀏覽器)需要做的

客戶端可以多種方式可以實現JSONP的調用

  • larave-cors做了什么

CORS是一個W3C標准,全稱是"跨域資源共享"(Cross-origin resource sharing)。
它允許瀏覽器向跨源服務器,發出XMLHttpRequest請求,從而克服了AJAX只能同源使用的限制。
laravel-cors官方介紹入下:

The laravel-cors package allows you to send Cross-Origin Resource Sharing headers with ACL-style per-url configuration.

也就是說,laravel-cors是在服務端允許了所有帶有跨域資源請求的header,並當成正常請求處理,從服務端解決了跨域資源共享的問題。

關於更多的laravel-cors使用配置,請移步 larave-cors官方GitHub倉庫


第二種,最方便的,新建一個middleWare,把這個middleware加入到全局中間件,所有的請求,都會經過這個中間件的過濾。

php artisan make:middleware CrossHttp
  • 1

然后就會在\app\Http\Middleware\CrossHttp.php這個中間件,在handle方法里面添加如下代碼:

    public function handle($request, Closure $next) { $response = $next($request); $response->header('Access-Control-Allow-Origin', '*'); $response->header('Access-Control-Allow-Headers', 'Origin, Content-Type, Cookie, Accept'); $response->header('Access-Control-Allow-Methods', 'GET, POST, PATCH, PUT, OPTIONS'); $response->header('Access-Control-Allow-Credentials', 'false'); return $response; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

意思是允許所有的域都能訪問這個接口。但是這時候不能傳遞session和cookie,如果想要指定域名來訪問,就這樣寫:

$response->header('Access-Control-Allow-Origin', 'http://mytest.com');
  • 1

這個意思就是只允許http://mytest.com來訪問這個接口。 
到這里還沒完,中間件建立了,我們還要加到\app\Http\Kernel.php里面去,不然不能生效。 
這時候就有選擇了,加到全局還是routeGroup?這個就取決於你的應用了,如果你的應用完全是接口,而且都是跨域,name就加到global那里去。如下圖所示:

這里寫圖片描述

如果你是某幾個接口需要跨域,就寫到下面那個routeMiddle里面去。

這里寫圖片描述

然后用的時候就在路由里面加上這個中間件的別名即可。

這個方法比較簡單直接,但是有個缺陷,如果我要多個域名使用接口,並不是所有的,因為*太過open,一個域名又太過死板。怎么辦,那就繼續往下看。

第三個方法:

在服務器端做文章,直接對來訪的域名進行過濾,只允許指定的一些域名來訪問這些接口。

With .htaccess you can do it like this: # ---------------------------------------------------------------------- # Allow loading of external fonts # ---------------------------------------------------------------------- <FilesMatch "\.(ttf|otf|eot|woff)$"> <IfModule mod_headers.c> SetEnvIf Origin "http(s)?://(www\.)?(google.com|staging.google.com|development.google.com|otherdomain.net|dev02.otherdomain.net)$" AccessControlAllowOrigin=$0 Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin </IfModule> </FilesMatch>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

這個我沒有測試過,這個需要在程序里面允許所有的,即Access-Control-Allow-Origin', '*',但是在服務器上只允許部分域名訪問。

參考鏈接:

https://stackoverflow.com/questions/1653308/access-control-allow-origin-multiple-origin-domains

https://stackoverflow.com/questions/25309318/best-method-access-control-allow-origin-multiple-origin-domains


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM