17

私はAPIを書いており、それを達成するためにLaravel 4を使用しています。私のAPIは別のドメインにあります。次のように仮定します。http://api-example.com/

そして、基本認証を使用して、バックボーンを介して Web アプリ (つまり) の API に ajax リクエストを作成しようとすると、mydomain.com正常に機能することもありますが、機能しないこともあります。私はその理由を理解しようとしています。以下は私のApp::beforeフィルターとApp::afterフィルターです。

App::before(function($request)
{
    if($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
        $statusCode = 204;

        $headers = [
            'Access-Control-Allow-Origin'      => 'http://mydomain.com',
            'Allow'                            => 'GET, POST, OPTIONS',
            'Access-Control-Allow-Headers'     => 'Origin, Content-Type, Accept, Authorization, X-Requested-With',
            'Access-Control-Allow-Credentials' => 'true'
        ];

        return Response::make(null, $statusCode, $headers);
    }
});

そして私のアフターフィルター:

App::after(function($request, $response)
{
    $response->headers->set('Access-Control-Allow-Origin', 'http://mydomain.com');
    $response->headers->set('Allow', 'GET, POST, OPTIONS');
    $response->headers->set('Access-Control-Allow-Headers', 'Origin, Content-Type, Accept, Authorization, X-Requested-With');
    $response->headers->set('Access-Control-Allow-Credentials', 'true');
    return $response;
});

問題は、資格情報を使用して投稿リクエストを作成しようとすると/login、API がデータベースをチェックし、ユーザーの API キーを取得することです。これはうまく機能しています。しかし、クロムに POST リクエストを送信しようとすると、/users次のエラーが表示されます。

XMLHttpRequest cannot load http://api-example.com/users. Origin http://mydomain.com is not allowed by Access-Control-Allow-Origin.

インターネットから見つけることができるすべてのものに設定Access-Control-Allow-Originするなど、すべてを試しました。'*'しかし、これまでのところ何も機能していません。どうすればいいのかわからない。

4

3 に答える 3

6

ヘッダー名に誤りがあります。

header('Allow', 'GET, POST, OPTIONS'); // This is wrong.

header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS'); // This is right.              
于 2013-09-02T13:15:34.650 に答える
3

派手な応答オブジェクトを作成してそれを返し、CORS ヘッダーを消去して通常のコンテンツを続行するため、ページ プロセスを実行しても意味がありません。

App::before(function($request)
{
    if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {

        header('Access-Control-Allow-Origin', 'http://mydomain.com');
        header('Allow', 'GET, POST, OPTIONS');
        header('Access-Control-Allow-Headers', 'Origin, Content-Type, Accept, Authorization, X-Request-With');
        header('Access-Control-Allow-Credentials', 'true');

        exit;
    }
});
于 2013-08-16T19:49:06.407 に答える
0

一部のブラウザーはこれを拒否する場合があります。これは、XSS スクリプトがそのような厄介なことを行っているためです。

http://api-example.com/から js ファイルをロードすると役立つかもしれませんが、より安定した解決策があります。

  • curl(または同様のもの)または
  • AJAXリクエストにプロキシ(Apache、Nginxなど)を使用して、他のホストからのレスポンスをロードできます
  • または、ロード バランサーやフロントエンド キャッシュを使用している場合は、ルールを作成できます...

インフラストラクチャとニーズによって異なりますが、パフォーマンスが重要な場合は curl をスキップしてください。

于 2013-07-26T10:25:33.950 に答える