9

RESTful Web サービスを作成しようとしていますが、PUT 要求の実装で行き詰まりました。このサイトの他の回答や Mozilla のさまざまな記事に従おうとしましたが失敗しました。

要求はドメインから生成され、wwwtest.dev-box(test.dev-box基本的にはバックエンド アプリを呼び出すフロントエンド アプリ) に送信されます。ライブ HTTP ヘッダーからキャプチャしたヘッダーは次のとおりです。

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

私はフレームワークを使用しているので、すべてが web.php にルーティングされます。これには、ページの上部に次のコードが含まれています (この MDN 記事から取得):

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");
}

コードが PUT リクエストを作成する前に、最初に CORS プリフライト OPTIONS リクエストを送信します (上記のキャプチャからわかるように)。必要なヘッダーを応答に添付して、要求者に PUT が許可されていることを伝える必要があります。残念ながら、上記の応答ヘッダーからわかるように、PUT が応答 access-control-allow-methods に含まれていても、405 Method Not Allowed が返されます。

これは、私が使用しているフレームワーク (Silex) の .htaccess ファイルです。

<IfModule mod_rewrite.c>
    Options -MultiViews

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

2 に答える 2

13

答えは、Apache とフレームワーク構成のクロスであることがわかりました。

  1. Apache 構成の場合、以下を VirtualHost ディレクティブまたは要求されたドメインの .htaccess ファイルに入れることができます (.htaccess にある場合は、IfModule mod_headers.c タグでカプセル化することを忘れないでください)。mod_rewrite がリダイレクトするページにヘッダーを設定しても機能しません。
    Header set Access-Control-Allow-Origin "http://wwwtest.dev-box"
    Header set Access-Control-Allow-Methods "GET,POST,HEAD,DELETE,PUT,OPTIONS"
  1. Silex 構成の場合、以下をアプリケーション ルートに配置します。基本的に、受信した OPTIONS リクエストに対して HTTP 200 OK を送信します。Silex Google Groupで見つかったコード:
    $app->match("{url}", function($url) use ($app) {
        return "OK";
    })->assert('url', '.*')->method("OPTIONS");

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

于 2013-10-16T20:43:16.410 に答える