為 Laravel 實作 https://github.com/fruitcake/php-cors
從 Laravel 9.2 開始,這個中間件包含在 laravel/framework 中。您可以使用提供的中間件,該中間件應與此包中提供的中間件和配置相容。請參閱 https://github.com/laravel/laravel/pull/5825/files 以了解變更。
升級步驟:
從你的composer.json中刪除"fruitcake/laravel-cors"
在app/Http/Kernel.php
中將FruitcakeCorsHandleCors::class,
替換為IlluminateHttpMiddlewareHandleCors::class,
有關進階用法,請參閱https://github.com/fruitcake/php-cors
。配置保持不變。
laravel-cors
套件可讓您使用 Laravel 中間件配置發送跨來源資源共用標頭。
如果您想全面了解 CORS 工作流程,可以瀏覽此圖片。
從 0.x 版本升級時,有一些重大更改:
新的“paths”屬性用於在某些路由上啟用/停用 CORS。預設為空,請正確填寫!
不再支援群組中間件,使用全域中間件
供應商名稱已變更(請參閱安裝/使用)
cors.php
中 props 的大小寫已從camelCase更改為snake_case,因此如果您已經有cors.php
文件,則需要更新其中的props以匹配新的大小寫。
處理 CORS 飛行前 OPTIONS 請求
將 CORS 標頭加入您的回應中
匹配路由以僅將 CORS 新增至某些請求
在您的composer.json
中需要fruitcake/laravel-cors
套件並更新您的依賴項:
作曲家需要 Fruitcake/laravel-cors
如果出現衝突,可能是因為安裝了舊版的 barryvdh/laravel-cors 或 Fruitcake/laravel-cors。先刪除衝突的包,然後再嘗試安裝:
作曲家刪除 barryvdh/laravel-cors Fruitcake/laravel-cors 作曲家需要 Fruitcake/laravel-cors
若要允許所有路由使用 CORS,請在app/Http/Kernel.php
類別的$middleware
屬性頂部新增HandleCors
中間件:
protected $middleware = [ FruitcakeCorsHandleCors::class,// ...];
現在更新配置以定義要執行 CORS 服務的路徑(請參閱下方的配置):
'路徑' => ['api/*'],
預設值在config/cors.php
中設定。發布配置以將檔案複製到您自己的配置中:
php artisan 供應商:發布 --tag="cors"
注意:使用自訂標頭(例如
X-Auth-Token
或X-Requested-With
時,您必須設定allowed_headers
以包含這些標頭。您也可以將其設定為['*']
以允許所有自訂標頭。
注意:如果您明確將標頭列入白名單,則必須包含
Origin
,否則請求將無法被識別為 CORS。
選項 | 描述 | 預設值 |
---|---|---|
路徑 | 您可以為 1 個或多個路徑啟用 CORS,例如。 ['api/*'] | [] |
允許的方法 | 匹配請求方法。 | ['*'] |
允許的來源 | 匹配請求來源。可以使用通配符,例如。 *.mydomain.com 或mydomain.com:* | ['*'] |
允許的來源模式 | 將請求來源與preg_match 進行比對。 | [] |
允許的標題 | 設定 Access-Control-Allow-Headers 回應標頭。 | ['*'] |
暴露的標題 | 設定 Access-Control-Expose-Headers 回應標頭。 | [] |
最大年齡 | 設定 Access-Control-Max-Age 回應標頭。 | 0 |
支援憑證 | 設定 Access-Control-Allow-Credentials 標頭。 | false |
allowed_origins
、 allowed_headers
和allowed_methods
可以設定為['*']
以接受任何值。
注意:對於
allowed_origins
在不使用萬用字元時必須包含方案,例如。['http://example.com', 'https://example.com']
。您還必須考慮到使用allowed_origins_patterns
時將出現該方案。
注意:盡量具體。您可以在寬鬆的約束下開始開發,但最好盡可能嚴格!
注意:由於 Laravel 中的 http 方法重寫,允許 POST 方法也將使 API 使用者能夠執行 PUT 和 DELETE 請求。
注意:有時需要指定連接埠(例如,當您在本機環境中編寫應用程式時) 。您也可以在此指定連接埠或使用通配符,例如。
localhost:3000
、localhost:*
甚至使用 FQDNapp.mydomain.com:8080
在 Lumen 上,只需在bootstrap/app.php
檔案中手動註冊 ServiceProvider:
$app->register(FruitcakeCorsCorsServiceProvider::class);
也將 cors.php 設定檔複製到config/cors.php
並將其付諸實踐:
$app->configure('cors');
若要允許所有路由使用 CORS,請將HandleCors
中間件新增至全域中間件並在配置中設定paths
屬性。
$app->middleware([// ...FruitcakeCorsHandleCors::class, ]);
確保配置中的path
選項正確並且與您正在使用的路由實際相符。請記得也要清除配置快取。
有時會傳回自己回應的錯誤/中介軟體可能會阻止 CORS 中間件運作。嘗試更改中間件的順序,並確保它是全域中間件中的第一個條目,而不是路由組。也要檢查日誌中是否有實際錯誤,因為如果沒有 CORS,錯誤將被瀏覽器吞沒,僅顯示 CORS 錯誤。也可以嘗試在沒有 CORS 的情況下運行它,以確保它確實有效。
如果您的要求包含授權標頭或使用憑證模式,請將設定中的supports_credentials
值設為true。這會將 Access-Control-Allow-Credentials 標頭設為true
。
如果您在程式碼中使用echo()
、 dd()
、 die()
、 exit()
、 dump()
等,則會破壞中間件流程。當輸出在標頭之前發送時,無法新增 CORS。當腳本在 CORS 中間件完成之前退出時,將不會新增 CORS 標頭。始終傳回正確的回應或拋出例外。
如果可能,請使用停用了 CSRF 保護的路由群組。否則,您可以在AppHttpMiddlewareVerifyCsrfToken
中停用某些請求的 CSRF:
protected $ except = ['api/*','sub.domain.zone' => ['前綴/*'], ];
CORS 中間件應該是增加這些標頭的唯一位置。如果您也在 .htaccess、nginx 或 index.php 檔案中新增標頭,您將得到重複的標頭和意外結果。
如果您沒有進行跨網站要求,這表示如果您沒有從 site-b.com 要求 site-a.com/api,您的瀏覽器將不會發送Origin: https://site-b.com
請求標頭, CORS 將被“禁用”,因為Access-Control-Allow-Origin
標頭也將丟失。發生這種情況是因為請求是從同一請求發送的,在這種情況下不需要保護。
根據 MIT 許可證發布,請參閱許可證。