成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

「新輪子」PHP CORS (Cross-origin resource sharing),解決 P

lbool / 3358人閱讀

摘要:而我的新輪子也并不是專門解決它的問題的,而是順便解決而已。概述這個包,支持在所有的項目中使用。一旦出現(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 、intstring 類型的配置可以使用 .env 進行環(huán)境變量設(shè)置:

Key 描述
CORS_ALLOW_CREDENTIAILS bool, 設(shè)置 Access-Control-Allow-Credentialstrue 還是 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.phpprotected $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.phpprotected $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 默認的兩個路由中間件組有 webapi 兩個組,首先 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

相關(guān)文章

  • 【日常填坑】之a(chǎn)jax請求laravel的api接口

    摘要:合適和夠用是最完美的追求。比如從頁面去請求的資源。它允許瀏覽器向跨源服務(wù)器,發(fā)出請求,從而克服了只能同源使用的限制。定義在中的路由都是無狀態(tài)的,并且會應(yīng)用中間件組。 關(guān)于作者 程序開發(fā)人員,不拘泥于語言與技術(shù),目前主要從事PHP和前端開發(fā),使用Laravel和VueJs,App端使用Apicloud混合式開發(fā)。合適和夠用是最完美的追求。 個人網(wǎng)站:http://www.linganm...

    Arno 評論0 收藏0
  • 【日常填坑】之a(chǎn)jax請求laravel的api接口

    摘要:合適和夠用是最完美的追求。比如從頁面去請求的資源。它允許瀏覽器向跨源服務(wù)器,發(fā)出請求,從而克服了只能同源使用的限制。定義在中的路由都是無狀態(tài)的,并且會應(yīng)用中間件組。 關(guān)于作者 程序開發(fā)人員,不拘泥于語言與技術(shù),目前主要從事PHP和前端開發(fā),使用Laravel和VueJs,App端使用Apicloud混合式開發(fā)。合適和夠用是最完美的追求。 個人網(wǎng)站:http://www.linganm...

    neu 評論0 收藏0
  • 【日常填坑】之a(chǎn)jax請求laravel的api接口

    摘要:合適和夠用是最完美的追求。比如從頁面去請求的資源。它允許瀏覽器向跨源服務(wù)器,發(fā)出請求,從而克服了只能同源使用的限制。定義在中的路由都是無狀態(tài)的,并且會應(yīng)用中間件組。 關(guān)于作者 程序開發(fā)人員,不拘泥于語言與技術(shù),目前主要從事PHP和前端開發(fā),使用Laravel和VueJs,App端使用Apicloud混合式開發(fā)。合適和夠用是最完美的追求。 個人網(wǎng)站:http://www.linganm...

    fuyi501 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<