laravelをバックエンドサーバーとして使用するangularjsアプリを開発しています。laravelからのデータへのアクセスに問題があります。各GETリクエストの前にangular最初に以下のようにOPTIONリクエストを送信します
OPTIONS /61028/index.php/api/categories HTTP/1.1
Host: localhost
Connection: keep-alive
Cache-Control: max-age=0
Access-Control-Request-Method: GET
Origin: http://localhost:3501
Access-Control-Request-Headers: Origin, x-requested-with, accept
Accept: */*
Referer: http://localhost:3501/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: UTF-8,*;q=0.5
Beforeフィルターに次のコードを追加してこれに対応しようとしました
if (Request::getMethod() == "OPTIONS") {
$headers = array(
'Access-Control-Allow-Origin' =>' *',
'Access-Control-Allow-Methods'=>' POST, GET, OPTIONS, PUT, DELETE',
'Access-Control-Allow-Headers'=>'X-Requested-With, content-type',);
return Response::make('', 200, $headers);
}
これにより、ヘッダー付きの応答が作成されます
Content-Encoding: gzip
X-Powered-By: PHP/5.3.5-1ubuntu7.11
Connection: Keep-Alive
Content-Length: 20
Keep-Alive: timeout=15, max=97
Server: Apache/2.2.17 (Ubuntu)
Vary: Accept-Encoding
access-control-allow-methods: POST, GET, OPTIONS, PUT, DELETE
Content-Type: text/html; charset=UTF-8
access-control-allow-Origin: *
cache-control: no-cache
access-control-allow-headers: X-Requested-With, content-type
ヘッダーは設定されていますが、ブラウザーはまだエラーをスローします
XMLHttpRequest cannot load http://localhost/61028/index.php/api/categories. Origin http://localhost:3501 is not allowed by Access-Control-Allow-Origin.
また、以下のように、リクエストのヘッダーに表示されるオリジンに許可オリジンを設定してみました
$Origin=Request::header('Origin');
//then within the headers
'Access-Control-Allow-Origin' =>' '.$Origin[0],
それでも同じエラー私は何が間違っていますか?どんな助けでも大歓迎です。
私は現在、OPTIONSリクエストが受信されたときにlaravelの初期化をオーバーライドする非常に醜いハックを使用しています。これはindex.phpで行いました
<?php
if ($_SERVER['REQUEST_METHOD']=='OPTIONS') {
header('Access-Control-Allow-Origin : *');
header('Access-Control-Allow-Methods : POST, GET, OPTIONS, PUT, DELETE');
header('Access-Control-Allow-Headers : X-Requested-With, content-type');
}else{
/**
* Laravel - A PHP Framework For Web Artisans
*
* @package Laravel
* @version 3.2.13
* @author Taylor Otwell <[email protected]>
* @link http://laravel.com
*/
また、before-filterにallow-Originヘッダーを追加する必要がありました。
これは賢くないことはわかっていますが、今のところ私の唯一の解決策です
これは、上記の問題に関する質問への言及です。 laravelとangularJSのバージョンについて言及していません。私は、lattest angularJSとLaravelを使用していると思います。また、angularがホストされていると仮定します- http:// localhost:3501およびlaravelはhttp:// localhostでホストされています以下の手順に従ってください。
Laravelの/public/.htaccessファイルのコードブロックの下に置きます
Header set Access-Control-Allow-Origin "http://localhost:3501"
Header set Access-Control-Allow-Methods "GET,POST,PUT,DELETE,OPTIONS"
Header set Access-Control-Allow-Credentials "true"
角度の構成で行の下に置きます
$httpProvider.defaults.withCredentials = true;
*をワイルドカード文字として使用しないでください。 Larvelはセッション管理のドメインを識別できません。したがって、完全なドメイン名としてhttp:// localhost:3501をAccess-Control-Allow-Originに設定します。これらはあなたを助けると思います。
これは、Laravel最近取得したバグ fixed のバグです。最新のリビジョンに更新することをお勧めします。
また、サーバーでCORSサポートを有効にする必要があります。