摘要:而我的新輪子也并不是專門解決它的問題的,而是順便解決而已。概述這個包,支持在所有的項目中使用。一旦出現(xiàn)成員,代表允許全部。列出允許跨域請求的方法列表,默認是代表所有方法。信息地址嗯,新輪子,求一波。
是的,可能了解 Laravel 的都知道,在 Laravel 中簡單的設(shè)置跨域,當然是選擇 barryvdh/laravel-cors 這個包。
起因是的,我確實是在重復造輪子,barryvdh/laravel-cors 包實現(xiàn)很優(yōu)秀了,但是它也有很多問題。而我的新輪子 medz/cors 也并不是專門解決它的問題的,而是順便解決而已。medz/cors 包的靈感來自公司項目,公司的項目使用 Laravel 框架進行開發(fā),前端使用完全分離的方式。所以需要設(shè)置跨域,而傳統(tǒng) nginx 設(shè)置跨域雖然可信,但是程序設(shè)置跨域優(yōu)點不言而喻(可以設(shè)置多個允許跨域域名等,動態(tài)處理信息)。
概述medz/cors 這個包,支持在所有 PHP 的項目中使用。你只需要一些簡單的配置即可。而這里主要先講在 Laravel 中的應(yīng)用,因為目前內(nèi)置支持暫時對 Laravel 做了很好的專屬處理。
打算友好支持如下
[x] PHP Native coding.
[x] Laravel
[x] PSR-7
[ ] Symfony
[ ] Yii2
[ ] Slim Framework
安裝感謝 Composer 為社區(qū)帶來的改變,現(xiàn)在我們都喜歡它,所以你只需要在你的項目中使用:
composer require medz/cors
好了,你已經(jīng)安裝好了。如果你是 Laravel,那么,現(xiàn)在你已經(jīng)為你的程序加上了跨域
發(fā)布配置文件運行:
php artisan vendor:publish --provider="MedzCorsLaravelProvidersLaravelServiceProvider" --force
有興趣看配置的可以看一下 config/cors.php 的配置。但是下面會專門講配置的。
配置為了方便一些配置,個別 bool 、int 和 string 類型的配置可以使用 .env 進行環(huán)境變量設(shè)置:
Key | 描述 |
---|---|
CORS_ALLOW_CREDENTIAILS | bool, 設(shè)置 Access-Control-Allow-Credentials 是 true 還是 false |
CORS_ACCESS_CONTROL_MAX_AGE | int, 設(shè)置 Access-Control-Max-Age 的值,默認是 0,即關(guān)閉 |
CORS_LARAVEL_ALLOW_ROUTE_PERFIX | string,路由匹配模式的匹配規(guī)則,因為使用 $request->is 進行檢查,所以你可以參考 請求,默認是 *,代表所有路由。 |
CORS_LARAVEL_ROUTE_GROUP_MODE | bool, 是否啟用「單一路由中間件」或者「路由中間件組」模式,默認是不啟用。 |
然后所有的配置如下(建議看一下 config/cors.php 文件每個配置的注釋):
Key | 描述 |
---|---|
allow-credentiails | 參考 CORS_ALLOW_CREDENTIAILS 配置 |
allow-headers | 列出允許的 header 字段列表,默認是 ["*"] 代表全部,你可以設(shè)置例如「"[Content-Type", "X-Requested-With"]」只允許上面的兩個 header 字段,具體根據(jù)你的項目而定。一旦出現(xiàn) * 成員,代表允許全部。 |
expose-headers | 列出了哪些首部可以作為響應(yīng)的一部分暴露給外部。默認為 [] 。 |
origins | 列出允許跨域的域名,默認是 ["*"], 代表設(shè)置為 *(只要出現(xiàn) * 在列中都會返回 *),例如設(shè)置 ["https://laravel-china.org"],可以設(shè)置多個,程序會自動處理。 |
methods | 列出允許跨域請求的方法列表,默認是 ["*"] 代表所有方法。 |
max-age | 預檢請求返回的結(jié)果是否可以被緩存,默認是 0 即代表不可以被緩存,單位是「秒」你可以設(shè)置允許預檢請求結(jié)果緩存多久。 |
laravel.allow-route-perfix | 參考 CORS_LARAVEL_ALLOW_ROUTE_PERFIX |
laravel.route-group-mode | 參考 CORS_LARAVEL_ROUTE_GROUP_MODE |
其實,你的 Laravel 程序依賴了這個medz/cors 你就不需要在進行任何代碼修改,就可以直接使用了。因為 Laravel 有一個神奇的特點吧,就是發(fā)起 OPTIONS 預檢請求的時候,執(zhí)行的中間件只有「全局中間件」,即 app/Http/Kernel.php 中 protected $middleware 所設(shè)置的中間件,所以針對 Laravel medz/cors 包自動在這里添加了 MedzCorsLaravelMiddlewareCors 中間件。你發(fā)現(xiàn),這個中間件如果你進行了一些配置,他是不會執(zhí)行其他任何處理的。
如果你希望自定義全局中間件的執(zhí)行順序,可以手動把 MedzCorsLaravelMiddlewareCors 添加到 $middleware 中。路由組模式
這是解決 barryvdh/laravel-cors 的痛點之一吧,因為 barryvdh/laravel-cors 會給所有的路由都加上跨域信息設(shè)置,這真的不是在實際中需要的,我們想要的是特定的路由組,或者特定的路由才支持跨域,其他的路由無法進行跨域請求。所以針對 Laravel 的開發(fā)中,有了這個模式。
而組模式需要用到的中間件叫做 MedzCorsLaravelMiddlewareShouldGroup,為了方便使用,你可以在 app/Http/Kernel.php 的 protected $routeMiddleware 中給它取一個簡短好記憶的別名,例如:
protected $routeMiddleware = [ "cors-should" => MedzCorsLaravelMiddlewareShouldGroup::class, ];
我給它取了一個名字叫做 cors-should,現(xiàn)在,你可以在特定的路由中設(shè)置允許跨域:
Route::middleware("cors-should")->get("test-cors", function () {});
當然,你也可以對一個路由組使用,和上面單個路由一樣,參考 Laravel 的 Route 文檔吧。
你還可以直接設(shè)置到中間件組,這樣,只允許某寫中間件組的 URI 允許跨域,例如 Laravel 默認的兩個路由中間件組有 web 和 api 兩個組,首先 web 組肯定不是我們想要跨域的,而 api 我們可能是完全的前后端分離開發(fā),前端程序不在當前 API 服務(wù)器的域上,產(chǎn)生了跨域,我們可以直接給 api 組設(shè)置允許 api 組跨域:
protected $middlewareGroups = [ /// ... "web" => [ // ... ], "api" => [ MedzCorsLaravelMiddlewareShouldGroup::class, // ... ], ];
當然,你給 MedzCorsLaravelMiddlewareShouldGroup::class 設(shè)置了路由中間價別名的話(例如:chors-should),你可以:
protected $middlewareGroups = [ /// ... "web" => [ // ... ], "api" => [ "cors-should", // ... ], ];
注意,路由組模式是會和「路由匹配模式」混合使用的路由匹配模式
在「配置中」講到了 ENV 常量 CORS_LARAVEL_ALLOW_ROUTE_PERFIX 或者配置文件中的 laravel.allow-route-perfix 是的,這就是路由匹配模式,默認是 * 即匹配所有。
路由匹配模式的匹配方法是使用 Laravel 中 IllumanteHttpRequest::is 方法,文檔請參考 Laravel 請求文檔,所以設(shè)置的規(guī)則和 Laravel 請求問中 is 方法要求一致。例如,我們希望 api 前綴的路由才開啟跨域:那么設(shè)置為:
api/*
即可,??注意,路由匹配模式就像在 「路由組模式」提到了,會和「路由組模式」進行一起匹配。以 API 為了,我們使用「路由組模式」只允許 api 中間件組的路由允許跨域,同時我們設(shè)置 api/v2/* 的「路由匹配模式」規(guī)則,那么,允許跨于的只有 api/v2/* 的路由可以,例如 api/v1/* 也是 api 中間件組的路由,雖然組模式匹配上了,但是「路由匹配模式」的規(guī)則沒有匹配上,所以 api/v1/* 的 路由是沒有跨域允許信息的。
終結(jié)其實 medz/cors 不只是在 Laravel 項目中使用,你可以用于任何 PHP 程序中,只是包只會內(nèi)置幾個主流框架的預設(shè)支持代碼而已,你可以用 Array 模式來讓所有的 PHP 程序都支持。
忘記的部分因為一些語法原因,這個包只能用在 PHP >= 7.0 的版本之上,并且暫時不會進行語法妥協(xié)。
信息GitHub 地址:https://github.com/medz/cors
嗯,新輪子,求一波 ?Star 。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/28410.html
摘要:合適和夠用是最完美的追求。比如從頁面去請求的資源。它允許瀏覽器向跨源服務(wù)器,發(fā)出請求,從而克服了只能同源使用的限制。定義在中的路由都是無狀態(tài)的,并且會應(yīng)用中間件組。 關(guān)于作者 程序開發(fā)人員,不拘泥于語言與技術(shù),目前主要從事PHP和前端開發(fā),使用Laravel和VueJs,App端使用Apicloud混合式開發(fā)。合適和夠用是最完美的追求。 個人網(wǎng)站:http://www.linganm...
摘要:合適和夠用是最完美的追求。比如從頁面去請求的資源。它允許瀏覽器向跨源服務(wù)器,發(fā)出請求,從而克服了只能同源使用的限制。定義在中的路由都是無狀態(tài)的,并且會應(yīng)用中間件組。 關(guān)于作者 程序開發(fā)人員,不拘泥于語言與技術(shù),目前主要從事PHP和前端開發(fā),使用Laravel和VueJs,App端使用Apicloud混合式開發(fā)。合適和夠用是最完美的追求。 個人網(wǎng)站:http://www.linganm...
摘要:合適和夠用是最完美的追求。比如從頁面去請求的資源。它允許瀏覽器向跨源服務(wù)器,發(fā)出請求,從而克服了只能同源使用的限制。定義在中的路由都是無狀態(tài)的,并且會應(yīng)用中間件組。 關(guān)于作者 程序開發(fā)人員,不拘泥于語言與技術(shù),目前主要從事PHP和前端開發(fā),使用Laravel和VueJs,App端使用Apicloud混合式開發(fā)。合適和夠用是最完美的追求。 個人網(wǎng)站:http://www.linganm...
閱讀 3704·2021-11-12 10:36
閱讀 3842·2021-09-22 15:48
閱讀 3551·2019-08-30 15:54
閱讀 2606·2019-08-29 16:44
閱讀 2374·2019-08-29 16:08
閱讀 2420·2019-08-29 16:06
閱讀 1294·2019-08-29 15:21
閱讀 3179·2019-08-29 12:39