24

私は、バックエンドサーバーとしてlaravelを使用するangularjsアプリを開発しています。各GETリクエストの前に、angularが最初に以下のようにOPTIONリクエストを送信するため、laravelからのデータにアクセスできません。

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.

また、以下のように、alloworiginをリクエストヘッダーに表示されているoriginに設定してみました

$origin=Request::header('origin');
//then within the headers
'Access-Control-Allow-Origin' =>' '.$origin[0],

それでも同じエラー何が間違っているのですか?どんな助けでも大歓迎です。

編集1

私は現在、OPTIONSリクエストを受信したときに、laravelsの初期化をオーバーライドする非常に醜いハックを使用しています。これは私が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 <taylorotwell@gmail.com>
 * @link     http://laravel.com
 */

また、allow-originヘッダーをbeforeフィルターに追加する必要がありました。

私はこれが賢くないことを知っていますが、それは今のところ私の唯一の解決策です

4

3 に答える 3

3

これは、上記の問題に関するあなたの質問を参照しています。あなたはlaravelとangularJSのバージョンについて言及していません。最新の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に設定します。これらはあなたを助けると思います。

于 2014-09-23T06:02:03.557 に答える
-1

最近修正されたLaravelのバグです。最新のリビジョンに更新することをお勧めします。

また、サーバーのCORSサポートを有効にする必要があります。

于 2013-01-21T07:15:05.750 に答える
-2

これをindex.phpファイルに追加します

header('Access-Control-Allow-Origin: *'); 
header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token');
于 2016-09-19T12:05:44.310 に答える