1

私は現在 Backbone.js を試していますが、CORS リクエストに少し問題があります。

Silex を使用して基本的な PHP ベースの API をセットアップし、それを指すようにバックボーン モデル/コレクションを設定しました。Chrome Network タブを見ると、飛行前の OPTIONS リクエストが機能していることがわかります。

リクエスト

OPTIONS /todo/ HTTP/1.1
Host: api.backbone.dev
Connection: keep-alive
Access-Control-Request-Method: POST
Origin: http://backbone.dev
User-Agent: ...
Access-Control-Request-Headers: accept, origin, x-http-method-override, content-type
Accept: */*
Referer: http://backbone.dev/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-GB,en;q=0.8,en-US;q=0.6,de;q=0.4

応答

HTTP/1.1 200 OK
Server: nginx/1.4.2
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
X-Powered-By: PHP/5.5.1-2+debphp.org~precise+2
Access-Control-Allow-Origin: http://backbone.dev
Access-Control-Allow-Methods: GET,PUT,POST,DELETE,OPTIONS
Access-Control-Allow-Headers: X-CSRF-Token, X-Requested-With, Accept, Accept-Version, Content-Length, Content-MD5, Content-Type, Date, X-Api-Version, X-HTTP-Method-Override, Origin
Cache-Control: no-cache
Content-Encoding: gzip

しかし、POST では、コンソールは次を返します。

XMLHttpRequest cannot load http://api.backbone.dev/todo/. Origin http://backbone.dev is not allowed by Access-Control-Allow-Origin.

My Nginx Server ブロックには、以下の Access-Control ヘッダーが含まれています。

add_header 'Access-Control-Allow-Origin' 'http://backbone.dev';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Headers' 'Content-Type,Accept,X-HTTP-Method-Override,Origin';
add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS';

PHP 応答に以下のヘッダーを追加するまで、OPTIONS 要求はまったく機能しませんでした。

array(
    'Access-Control-Allow-Origin' => 'http://backbone.dev',
    'Access-Control-Allow-Methods' => 'GET,PUT,POST,DELETE,OPTIONS',
    'Access-Control-Allow-Headers' => 'X-CSRF-Token, X-Requested-With, Accept, Accept-Version, Content-Length, Content-MD5, Content-Type, Date, X-Api-Version, X-HTTP-Method-Override, Origin'
);

そして今、POST リクエストは何も返しません。

リクエストの何が問題なのか、本当にわかりません。どんな助けでも大歓迎です。

4

2 に答える 2

1

CORS の場合、OPTIONS リクエストを処理する必要があります。matchsilex では、 と を使用してそれを行うことができます->method('OPTIONS')

$app->match('/path', $controller)->method('OPTIONS');

CORS プリフライト リクエストとヘッダーを処理するStack/Cors ( Stackに関するその他のドキュメント)のようなものを見たいと思うかもしれません。Access-Control-Allow-*

于 2013-08-18T21:10:25.933 に答える