2016-12-23 5 views
4

Laravelによって構築されたRESTful APIにアクセスしているAngularを使用してWebアプリケーションを作成する際に問題があります。 正しいヘッダーを渡すミドルウェアを作成しましたが、機能しません。Angular + LaravelプロジェクトのCORS問題

class Cors 
{ 
    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure $next 
    * @return mixed 
    */ 
    public function handle($request, Closure $next) 
    { 
     return $next($request) 
      ->header('Access-Control-Allow-Origin', '*') 
      ->header('Access-Control-Allow-Credentials', 'true') 
      ->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS') 
      ->header('Access-Control-Allow-Headers', 'X-Requested-With, Content-Type, X-Auth-Token, Origin, Authorization'); 
    } 
} 

いずれかを教えてください。

+1

「機能しない」について詳しく説明してください。 –

+0

XMLHttpRequestは[link](http://example.com)をロードできません。プリフライト要求への応答がアクセス制御チェックを通過しない:要求されたリソースに「アクセス制御許可」がない。したがって、 'http:// localhost:3000'はアクセスが許可されていません。このエラーは、postメソッドを使用してapiサーバーにアクセスしているときに発生しました。 –

+1

@ArviPalmuこれまでに表示された問題の詳細を指定する必要があります。失敗した場合に終了するHTTP要求ヘッダーをいくつか表示すると、他のユーザーが表示されている内容をよく理解できるようになります。 – Codemole

答えて

5

これは厄介な問題ですが、私は知っていますが、2つの解決策があります。

1.

あなたはルートを呼び出すすべてのAPIのためのOPTIONSメソッドを定義し、それはあなたが以下のように作成したミドルウェアを渡します

Route::options('todos/{any?}', ['middleware' => 'cors', function(){return;}]); 
Route::options('projects/{any?}', ['middleware' => 'cors', function(){return;}]); 

あなたはLaravelコアクラスファイルをハック、 OPTIONS要求ごとにCORSヘッダーを渡すようにします。それはOPTIONSのためのCORSヘッダを渡すように、あなたは、次のように機能

protected function getRouteForMethods($request, array $methods) 
    { 
     if ($request->method() == 'OPTIONS') { 
      return (new Route('OPTIONS', $request->path(), function() use ($methods) { 
       return new Response('', 200, ['Allow' => implode(',', $methods)]); 
      }))->bind($request); 
     } 

     $this->methodNotAllowed($methods); 
    } 

更新この機能を以下のでしょう

/vendor/laravel/framework/src/framework/Illuminate/Routing/RouteCollection.php 

がためにそう

protected function getRouteForMethods($request, array $methods) 
    { 
     if ($request->method() == 'OPTIONS') { 
      return (new Route('OPTIONS', $request->path(), function() use ($methods) { 
       return new Response('', 200, [ 
        'Allow' => implode(',', $methods), 
        'Access-Control-Allow-Origin' => '*', 
        'Access-Control-Allow-Credentials' => 'true', 
        'Access-Control-Allow-Methods' => 'GET, POST, PUT, DELETE, OPTIONS', 
        'Access-Control-Allow-Headers' => 'X-Requested-With, Content-Type, X-Auth-Token, Origin, Authorization', 
       ]); 

      }))->bind($request); 
     } 

     $this->methodNotAllowed($methods); 
    } 

を要求します私は、両方のソリューションが正常に動作します。選択はあなたのものです。 しかし、ソリューション#2はLaravelコアをハックするものですが、Laravel自体をアップグレードすると問題が発生する可能性があります。しかし、少なくともそれはコーディングが少なくなっています。 :D

これらのソリューションが役立つことを願っています。

+0

いいね!完璧。ありがとう、@レイ! –

+0

@RayCこれはすばらしい解決策です!私はソリューション#2を採用しており、それは魅力的なものとして働いた!私はGoogleの全面的な問題を解決するために検索しましたが、失敗しました、運がない、そしてトラップされましたが。どうもありがとう! –

関連する問題