Laravel開啟跨域請求的方法
項(xiàng)目中用到了接口,外部調(diào)用的時(shí)候老是請求不到,本地請求卻沒問題,查了下說是因?yàn)榭缬虻膯栴}。
根據(jù)網(wǎng)上所說解決方法如下:
1、建立中間件Cors.php
命令:php artisan make:middleware Cors
在/app/Http/Middleware/ 目錄下會出現(xiàn)一個Cors.php 文件。
2、在handle 方法中加入如下內(nèi)容:
$response = $next($request); $response->header('Access-Control-Allow-Origin', '*'); $response->header('Access-Control-Allow-Headers', 'Origin, Content-Type, Cookie, Accept, multipart/form-data, application/json'); $response->header('Access-Control-Allow-Methods', 'GET, POST, PATCH, PUT, OPTIONS'); $response->header('Access-Control-Allow-Credentials', 'false'); return $response;
其中有以下需要注意的地方:
對于跨域訪問并需要伴隨認(rèn)證信息的請求,需要在 XMLHttpRequest 實(shí)例中指定 withCredentials 為 true。
這個中間件你可以根據(jù)自己的需求進(jìn)行構(gòu)建,如果需要在請求中伴隨認(rèn)證信息(包含 cookie,session)那么你就需要指定 Access-Control-Allow-Credentials 為 true, 因?yàn)閷τ陬A(yù)請求來說如果你未指定該響應(yīng)頭,那么瀏覽器會直接忽略該響應(yīng)。
在響應(yīng)中指定 Access-Control-Allow-Credentials 為 true 時(shí),Access-Control-Allow-Origin 不能指定為 *(這個一定要注意,我就是在這個地方調(diào)了好久)
后置中間件只有在正常響應(yīng)時(shí)才會被追加響應(yīng)頭,而如果出現(xiàn)異常,這時(shí)響應(yīng)是不會經(jīng)過中間件的。
Cors.php文件內(nèi)容如下:
<?php namespace App\Http\Middleware; use Closure; class Cors { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ 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, multipart/form-data, application/json'); $response->header('Access-Control-Allow-Methods', 'GET, POST, PATCH, PUT, OPTIONS'); $response->header('Access-Control-Allow-Credentials', 'false'); return $response; } }
3、在 Kernel.php文件中的$middleware中加入剛剛添加的中間件:\App\Http\Middleware\Cors::class,
如:
protected $middleware = [ \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class, \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\Cors::class, ];
以下內(nèi)容為網(wǎng)絡(luò)摘抄:
跨源資源共享標(biāo)準(zhǔn)
跨源資源共享標(biāo)準(zhǔn)通過新增一系列 HTTP 頭,讓服務(wù)器能聲明哪些來源可以通過瀏覽器訪問該服務(wù)器上的資源。另外,對哪些會對服務(wù)器數(shù)據(jù)造成破壞性響應(yīng)的 HTTP 請求方法(特別是 GET 以外的 HTTP 方法,或者搭配某些 MIME 類型的 POST 請求),標(biāo)準(zhǔn)強(qiáng)烈要求瀏覽器必須先以 OPTIONS 請求方式發(fā)送一個預(yù)請求(preflight request),從而獲取知服務(wù)器端對跨源請求所支持 HTTP 方法。在確認(rèn)服務(wù)器允許跨源請求的情況下,以實(shí)際的 HTTP 請求方法發(fā)送那個真正的請求。服務(wù)器端也可以通知客戶端,是不是需要隨同請求一起發(fā)送信用信息(包括 Cookies 和 HTTP 認(rèn)證相關(guān)數(shù)據(jù))。
跨源共享標(biāo)準(zhǔn)需要瀏覽器和服務(wù)端共同配合才能完成,目前瀏覽器廠商已經(jīng)可以將請求部分自動完成,所以跨源資源訪問的重點(diǎn)還是在于服務(wù)器端。
下面列出一些標(biāo)準(zhǔn)中可用的響應(yīng)頭和請求頭。
Response Header
Access-Control-Allow-Origin : 指明哪些請求源被允許訪問資源,值可以為 “*”,”null”,或者單個源地址。
Access-Control-Allow-Credentials : 指明當(dāng)請求中省略 creadentials 標(biāo)識時(shí)響應(yīng)是否暴露。對于預(yù)請求來說,它表明實(shí)際的請求中可以包含用戶憑證。
Access-Control-Expose-Headers : 指明哪些頭信息可以安全的暴露給 CORS API 規(guī)范的 API。
Access-Control-Max-Age : 指明預(yù)請求可以在預(yù)請求緩存中存放多久。
Access-Control-Allow-Methods : 對于預(yù)請求來說,哪些請求方式可以用于實(shí)際的請求。
Access-Control-Allow-Headers : 對于預(yù)請求來說,指明了哪些頭信息可以用于實(shí)際的請求中。
Origin : 指明預(yù)請求或者跨域請求的來源。
Access-Control-Request-Method : 對于預(yù)請求來說,指明哪些預(yù)請求中的請求方式可以被用在實(shí)際的請求中。
Access-Control-Request-Headers : 指明預(yù)請求中的哪些頭信息可以用于實(shí)際的請求中。
Request Header
Origin : 表明發(fā)送請求或預(yù)請求的來源。
Access-Control-Request-Method : 在發(fā)送預(yù)請求時(shí)帶該請求頭,表明實(shí)際的請求將使用的請求方式。
Access-Control-Request-Headers : 在發(fā)送預(yù)請求時(shí)帶有該請求頭,表明實(shí)際的請求將攜帶的請求頭。
Author:leedaning
以上這篇Laravel開啟跨域請求的方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
- Laravel 5.5中為響應(yīng)請求提供的可響應(yīng)接口詳解
- 跟我學(xué)Laravel之請求與輸入
- 跟我學(xué)Laravel之請求(Request)的生命周期
- Laravel實(shí)現(xiàn)ApiToken認(rèn)證請求
- Laravel獲取當(dāng)前請求的控制器和方法以及中間件的例子
- laravel請求參數(shù)校驗(yàn)方法
- 解決在Laravel 中處理OPTIONS請求的問題
- 自定義Laravel (monolog)日志位置,并增加請求ID的實(shí)現(xiàn)
- laravel框架中表單請求類型和CSRF防護(hù)實(shí)例分析
- Laravel框架處理用戶的請求操作詳解
- Laravel5.1 框架Request請求操作常見用法實(shí)例分析
相關(guān)文章
ThinkPHP實(shí)現(xiàn)將本地文件打包成zip下載
這篇文章主要介紹了ThinkPHP實(shí)現(xiàn)將本地文件打包成zip下載的方法,需要的朋友可以參考下2014-06-06CodeIgniter配置之database.php用法實(shí)例分析
這篇文章主要介紹了CodeIgniter配置之database.php用法,結(jié)合實(shí)例形式較為詳細(xì)的分析總結(jié)了CodeIgniter常用的數(shù)據(jù)庫連接方式,需要的朋友可以參考下2016-01-01在Laravel中使用GuzzleHttp調(diào)用第三方服務(wù)的API接口代碼
今天小編就為大家分享一篇在Laravel中使用GuzzleHttp調(diào)用第三方服務(wù)的API接口代碼,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-10-10php 提交表單 關(guān)閉layer彈窗iframe的實(shí)例講解
今天小編就為大家分享一篇php 提交表單 關(guān)閉layer彈窗iframe的實(shí)例講解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08laravel-admin自動生成模塊,及相關(guān)基礎(chǔ)配置方法
今天小編就為大家分享一篇laravel-admin自動生成模塊,及相關(guān)基礎(chǔ)配置方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-10-10yii2 RBAC使用DbManager實(shí)現(xiàn)后臺權(quán)限判斷的方法
這篇文章主要介紹了yii2 RBAC使用DbManager實(shí)現(xiàn)后臺權(quán)限判斷的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Yii2權(quán)限控制的原理與相關(guān)技巧,需要的朋友可以參考下2016-07-07PHP 面向?qū)ο蟪绦蛟O(shè)計(jì)(oop)學(xué)習(xí)筆記(三) - 單例模式和工廠模式
設(shè)計(jì)模式是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。使用設(shè)計(jì)模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。2014-06-06