2017-08-29 9 views
0

私はsymfony 2バックエンドを持っており、それをサーバにインストールしました。私のフロントエンドはionic PWAなので、ブラウザで動作し、そのサーバにもインストールされますが、他のサブドメインにもインストールされます。私はバックエンドにWebアプリケーションからの要求を送信すると、私はこのエラーを取得しています:Symfony 2 - OPTIONSリクエストを許可する

OPTIONS https://api.example.com/api/login.json

XMLHttpRequest cannot load https://api.example.com/api/login.json . Response for preflight has invalid HTTP status code 405

これは、ログインアクションのための私のコードです:

/** 
* Login via username and password or via API key 
* 
* @Doc\ApiDoc(
* section="Security", 
* description="Login", 
* views={"default", "security"} 
*) 
* 
* @param ParamFetcher $params 
* 
* @Rest\RequestParam(name="username", nullable=true, description="Username") 
* @Rest\RequestParam(name="password", nullable=true, description="Password") 
* @Rest\RequestParam(name="apikey", nullable=true, description="API key (alternative to username + password)") 
* 
* @Rest\Post("/login", name="api_security_login", options={"method_prefix" = false}) 
* 
* @return Response 
*/ 
public function loginAction(ParamFetcher $params) 
{ 
    //...do some stuff here...// 

    $data = array(
     'user' => $userValue, 
     'apikey' => $user->getApiKey(), 
    ); 

    $groups = array('default', 'private'); 

    return $this->createAPIResponse(self::STATUS_OK, $data, $groups); 
} 

これはレスポンスからヘッダーです。

Access-Control-Allow-Methods:GET,POST,OPTIONS,DELETE,PUT 
Access-Control-Allow-Origin:* 
Allow:POST 
Cache-Control:no-cache 
Connection:Keep-Alive 
Content-Length:54 
Content-Type:application/json 
Date:Tue, 29 Aug 2017 08:33:26 GMT 
Keep-Alive:timeout=5, max=100 
Server:Apache 

これはprod.logファイルにエラーメッセージです:

request.ERROR: Uncaught PHP Exception Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException: "No route found for "OPTIONS /api/login.json": Method Not Allowed (Allow: POST)" at /var/www/example.com/api/htdocs/symfony/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/EventListener/RouterListener.php line 163 {"exception":"[object] (Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException(code: 0): No route found for \"OPTIONS /api/login.json\": Method Not Allowed (Allow: POST) at /var/www/example.com/api/htdocs/symfony/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/EventListener/RouterListener.php:163, Symfony\Component\Routing\Exception\MethodNotAllowedException(code: 0): at /var/www/example.com/api/htdocs/symfony/app/cache/prod/appProdUrlMatcher.php:855)"} []

したがって、「POST」だけが許可されている「許可」ヘッダーのために、CORSが許可されていないために送信されるOPTIONS要求のように見えます。だから、すべてのルートでそれを修正する最良の方法は何ですか?あなたがOPTIONSリクエストにお答えしたい場合は、@Rest\Options注釈を使用してオプションのルートを定義する必要が

@Rest\Post("/login", name="api_security_login", options={"method_prefix" = false})

答えて

1

あなただけPOST方法のためにあなたの行動上のルートを持っています。

アクション内に複数の注釈を付けて、アクション内でメソッドをテストすることができます(通常、フォームアクションの場合はGETPOST)。同じパスで異なるメソッドで2つの異なるアクションを定義します。

http://symfony.com/doc/master/bundles/FOSRestBundle/7-manual-route-definition.html

+0

はすでに '' 'でそれを試してみました@Rest \ Options( "/ login"、name = "api_security_login_options"、options = {"method_prefix" = false}) '' 'はポストの下にありますが、それでも同じ問題です – Nono

0

オプションのHTTPメソッドを受け入れるルートがありません。

あなたが最初に定義する必要があり
No route found for "OPTIONS /api/login.json" 

:その後

/** 
* @Rest\Route(
* "/login", 
* name="api_security_login", 
* methods = { 
*  Request::METHOD_POST, 
*  Request::METHOD_OPTIONS, 
* } 
*) 
*/ 

クリアキャッシュとルートがすなわち使用してアクティブであることを確認します

bin/console debug:router | grep -i api_security_login 
+0

そして、それがすべき場合であっても、すべてのルートを編集する必要があります...しかし、単純な方法はないようです。 – Nono

+0

あなたはあなたのルートがうまくいかない理由を尋ねました。答えはsymfonyが投げた例外からわかるように "存在しないため"です。 CORSの問題はありません。 'bin/consoleデバッグの出力は何ですか:router | grep -i api_security_login'を実行してください。 – nifr

+0

私はまず、一つの 'OPTIONS'要求に対して何が動作していないのかを調べることをお勧めします。すべてのコントローラアクション/ルートのオプションメソッドを許可します。簡単な方法はありますが、私があなたのために働いていない**と言っているだけで、変更を適用した後のアプリケーションの動作、例外メッセージ、またはコマンド出力についての情報は一切提供していないと私はあなたを助けることができません。 – nifr

関連する問題