2013-10-16 18 views
7

RESTfulなWebサービスを作成しようとしていて、PUTリクエストの実装に固執しました。私はこのサイトの他の回答やMozillaのさまざまな記事に従いましたが、失敗しました。HTTPを返すCORSプリフライトリクエスト405

ドメインwwwtest.dev-boxからリクエストが生成され、test.dev-box(基本的にはバックエンドアプリを呼び出すフロントエンドアプリ)になります。ここで私はライブHTTPヘッダからキャプチャしているヘッダは以下のとおりです。すべてがページの上部に次のコードを含む、web.phpにルーティングされるように、私はフレームワークを使用してい

http://test.dev-box/resource/v1/data/user/1 

OPTIONS /resource/v1/data/user/1 HTTP/1.1 
Host: test.dev-box 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-US,en;q=0.5 
Accept-Encoding: gzip, deflate 
Origin: http://wwwtest.dev-box 
Access-Control-Request-Method: PUT 
Connection: keep-alive 

HTTP/1.1 405 Method Not Allowed 
Date: Wed, 16 Oct 2013 16:15:58 GMT 
Server: Apache/2.2.15 (Red Hat) 
x-powered-by: PHP/5.3.27 
Access-Control-Allow-Origin: http://wwwtest.dev-box 
Access-Control-Allow-Methods: POST, GET, PUT, OPTIONS 
Access-Control-Max-Age: 1728000 
Content-Length: 0 
Allow: PUT 
Cache-Control: no-cache 
Connection: close 
Content-Type: text/html; charset=UTF-8 

this MDN articleから撮影) :

if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') { 
    header('Access-Control-Allow-Origin: http://wwwtest.dev-box'); 
    header('Access-Control-Allow-Methods: POST, GET, PUT, OPTIONS'); 
    header('Access-Control-Max-Age: 1728000'); 
    header("Content-Length: 0"); 
    header("Content-Type: text/plain"); 
} else { 
    header("HTTP/1.1 403 Access Forbidden"); 
    header("Content-Type: text/plain"); 
} 

私のコードは、それは(あなたが上記のキャプチャから見ることができるように)CORSプリフライトオプションが最初の要求を送信PUT要求を行う前に。必要なヘッダーを応答に添付し、PUTが許可されていることをリクエスターに通知する必要があります。残念ながら、上記の応答ヘッダーからわかるように、PUTが応答のaccess-control-allow-methodsにあっても、405 Method Not Allowedを返しています。

<IfModule mod_rewrite.c> 
    Options -MultiViews 

    RewriteEngine On 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteRule^web.php [QSA,L] 
</IfModule> 

答えて

12

答えは、Apacheとフレームワークの設定の間のクロスであることがわかりました。 Apacheの設定については

  1. あなたは(それが.htaccessファイルにいた場合のIfModule mod_headers.cタグでカプセル化することを忘れないでください)あなたのVirtualHostディレクティブに次のように置くことができるのいずれか、または要求されたドメインの.htaccessファイルに。 mod_rewriteのが動作しないためにリダイレクトすることをページ上のヘッダーを設定する:

    ヘッダーが

    ヘッダーが設定された「http://wwwtest.dev-box」アクセス制御 - 許可 - 起源を設定するアクセス制御 - 許可 - メソッド「GET、POST、HEAD、 DELETE、PUT、OPTIONS "

  2. Silexの設定では、次のものをアプリケーションのルートに配置します。それは受け取った任意のOPTIONS要求に対して基本的にHTTP 200 OKを送信します。コードはSilex Google Groupで見つかった:

    $ APP->試合( "{URL}"、機能($ URL)を使用します($アプリ){ リターン "OK"; }) - >アサート( 'URL'、 '。*') - >メソッド( "OPTIONS");

RESTfulアプリケーションを正しく機能させるには、両方の手順を完了する必要があります。

3

405は、実際のプリフライト/ OPTIONS要求への参照である:

これは私が使用しているフレームワークの.htaccessファイル(サイレックス)です。あなたのサーバーはOPTIONS要求が一般的にあなたのサーバーによって受け入れられないので、プレフライトを完全に拒否しています。 OPTIONS要求を受け入れるようにサーバー構成を変更する必要があります。単にPHPファイルにコードを含めるだけでは十分ではないかもしれません。ほとんどの場合、Web /アプリケーションサーバーはこの動詞を認識せず、PHPコードをヒットする前にリクエストを拒否している可能性があります。

+0

私が読んだ記事のいずれかでApacheのOPTIONS要求を完全に聞いたことがありません。これに関する情報、または私がそれをどのように設定するかという考えがありますか? –

+0

拝見すると、CORSヘッダーがレスポンスに含まれているので、PHPコードが実行されているようです。あなたのPHPコードの何かが、おそらく405を返すでしょう。すべてのPHPコードを投稿する必要があります。 –

+0

コードを投稿することはできませんが、SilexはSymfony2に基づくフレームワークです。私はアクセス制限やヘッダーの変更など何もしていません。ルートにPUTしようとして、データを取り戻そうとしています。 –

関連する問題