87

SLIM PHP フレームワークを使用して基本的な RESTful サービスを作成しましたが、Angular.js プロジェクトからサービスにアクセスできるように接続しようとしています。Angular はすぐに使用できる CORS をサポートしていることを読みました。実行する必要があるのは、次の行Header set Access-Control-Allow-Origin "*"を .htaccess ファイルに追加することだけでした。

私はこれを行っており、REST アプリケーションはまだ動作しています (悪い .htaccess による 500 内部サーバー エラーはありません) が、test-cors.orgからテストしようとすると、エラーがスローされます。

Fired XHR event: loadstart
Fired XHR event: readystatechange
Fired XHR event: error

XHR status: 0
XHR status text: 
Fired XHR event: loadend

私の .htaccess ファイルは次のようになります

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ /index.php [QSA,L]
Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT"

これを適切に機能させるために .htaccess に追加する必要があるものは他にありますか、またはサーバーで CORS を有効にする別の方法はありますか?

4

8 に答える 8

103

とにかくすべてが index.php に転送されていたので、.htaccess ファイルの代わりに PHP でヘッダーを設定しようと思ったのですが、うまくいきました! わーい!これは、この問題を抱えている他の人のために index.php に追加したものです。

// Allow from any origin
if (isset($_SERVER['HTTP_ORIGIN'])) {
    // should do a check here to match $_SERVER['HTTP_ORIGIN'] to a
    // whitelist of safe domains
    header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
    header('Access-Control-Allow-Credentials: true');
    header('Access-Control-Max-Age: 86400');    // cache for 1 day
}
// Access-Control headers are received during OPTIONS requests
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {

    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
        header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS");         

    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
        header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");

}

この質問に対する彼の回答は slashingweapon の功績によるものです

私はSlimを使用しているため、OPTIONSリクエストがHTTP 200レスポンスを取得できるように、このルートを追加しました

// return HTTP 200 for HTTP OPTIONS requests
$app->map('/:x+', function($x) {
    http_response_code(200);
})->via('OPTIONS');
于 2013-01-22T22:44:07.033 に答える
95

の代わりに.htaccess使用すべきではありませんか?addset

Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT"
于 2013-12-30T11:20:41.263 に答える
34

これは私のために働いたものです:

Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Headers "origin, x-requested-with, content-type"
Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"
于 2016-02-06T05:43:06.943 に答える
9

古いバージョンのslim(2.x)を使用しているようです。次の行を .htaccess に追加するだけで、PHP スクリプトで何もする必要はありません。

# Enable cross domain access control
SetEnvIf Origin "^http(s)?://(.+\.)?(domain_one\.com|domain_two\.net)$" REQUEST_ORIGIN=$0
Header always set Access-Control-Allow-Origin %{REQUEST_ORIGIN}e env=REQUEST_ORIGIN
Header always set Access-Control-Allow-Methods "GET, POST, PUT, DELETE"
Header always set Access-Control-Allow-Headers: Authorization

# Force to request 200 for options
RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule .* / [R=200,L]
于 2016-02-29T18:35:10.103 に答える
5

Devin のおかげで、マルチドメイン アクセスを使用する SLIM アプリケーションのソリューションを見つけました。

htaccess で:

SetEnvIf Origin "http(s)?://(www\.)?(allowed.domain.one|allowed.domain.two)$" AccessControlAllowOrigin=$0$1
Header set Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
Header set Access-Control-Allow-Credentials true

index.php で

// Access-Control headers are received during OPTIONS requests
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {

    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
        header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS");         

    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
        header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");
}
// instead of mapping:
$app->options('/(:x+)', function() use ($app) {
    //...return correct headers...
    $app->response->setStatus(200);
});
于 2014-10-27T14:26:36.143 に答える
1

@abimelex ソリューションを試しましたが、Slim 3.0 では、OPTIONS リクエストのマッピングは次のようになります。

$app = new \Slim\App();
$app->options('/books/{id}', function ($request, $response, $args) {
    // Return response headers
});

https://www.slimframework.com/docs/objects/router.html#options-route

于 2017-01-12T20:42:03.237 に答える