web-dev-qa-db-ja.com

codeigniterでcorsを有効にする(@chriskacerguisによるrestserver)

クライアントアプリとAPIがlocalhostにある場合、agularJsコントローラーのhttp.getリクエストは正常に機能します。 APIをサーバーに移動すると、問題が発生しました。

angularJsを使用するクライアント側

$http.get('http://domain.com/api/spots/2/0').success(function(datas){
console.log(datas);
});

ログの内容:Cross-Origin Request Blocked:Same Origin Policyは http://domain.com/api/spots/2/ のリモートリソースの読み取りを許可しません。これは、リソースを同じドメインに移動するか、CORSを有効にすることで修正できます。

これらの2行をコントローラー構成に追加しました

header("Access-Control-Allow-Origin: *");

header("Access-Control-Allow-Methods: GET");

まだ同じエラー。

7
onerinas

許可されたメソッドにOPTIONSを追加してみてください。

header("Access-Control-Allow-Methods: GET, OPTIONS");
header("Access-Control-Allow-Headers: Content-Type, Content-Length, Accept-Encoding");

ヘッダーを設定すると、リクエストがメソッド「OPTIONS」のときにすぐに返されます。

if ( "OPTIONS" === $_SERVER['REQUEST_METHOD'] ) {
    die();
}

この答え も参照してください。

Angularは W3C CORS仕様に準拠したプリフライトリクエスト を送信し、実際に試行する前に、許可されている適切なメソッドをチェックします。

個人的に、私は Mozilla Developer Network CORSページ CORSのフローを理解するのに役立つ問題について少し読みやすいと思います。

16
Ross

他の誰かが問題に直面している場合、Codeigniterのrest.phpファイルでCORSを有効にするREST Controllerが私のために働きました。これはここのコメント https:// github。 com/chriskacerguis/codeigniter-restserver/blob/master/application/config/rest.php

//Change this to TRUE
$config['check_cors'] = TRUE;

//No change here
$config['allowed_cors_headers'] = [
  'Origin',
  'X-Requested-With',
  'Content-Type',
  'Accept',
  'Access-Control-Request-Method'
];

//No change here
$config['allowed_cors_methods'] = [
  'GET',
  'POST',
  'OPTIONS',
  'PUT',
  'PATCH',
  'DELETE'
];

//Set to TRUE to enable Cross-Origin Resource Sharing (CORS) from any source domain
$config['allow_any_cors_domain'] = TRUE;


//Used if $config['check_cors'] is set to TRUE and $config['allow_any_cors_domain'] is set to FALSE. 
//Set all the allowable domains within the array
//e.g. $config['allowed_origins'] =['http://www.example.com','https://spa.example.com']

$config['allowed_cors_origins'] = [];
11
Amal Ajith

コントローラクラスに次のコンストラクタを追加しました

public function __construct($config = 'rest')
{
    header('Access-Control-Allow-Origin: *');
    header("Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE");
    parent::__construct();
}
3
muTheTechie

クライアント側=> AngularJs(localhost:9000でGruntで実行)サーバー側=> php(codeIgniterソリューション)(localhost:80で実行)

私のために働いた唯一のことは、私のphpプロジェクトのwebservicesコントローラーにこの行を追加することでした:

         /*
           here you do whatever you do to build the $data 

         */

        //but just before returning the method data add this

        header('Content-type: application/json');
        header("Access-Control-Allow-Origin: *");
        header("Access-Control-Allow-Methods: GET");
        header("Access-Control-Allow-Methods: GET, OPTIONS");
        header("Access-Control-Allow-Headers: Content-Type, Content-Length, Accept-Encoding");
        echo json_encode($data, JSON_NUMERIC_CHECK);
1
Alonso

jQuery Ajaxを使用できる場合は、スクリプトでこの行を使用します。

jQuery.support.cors = true; // force cross-site scripting (as of jQuery 1.5)

サイドバーデスクトップガジェットからxampp phpファイルにjQuery Ajaxを使用して文字列を投稿しようとしたときに、問題が解決しました。

0
Sizzling Code