2017-08-29 70 views
0

我有一個symfony 2後端,我已經安裝在服務器上。我的前端是離子PWA,因此它在瀏覽器中運行,並且也安裝在該服務器上,但是與其他子域一起安裝。當我送從Web應用程序的請求到後臺,我得到這個錯誤:Symfony 2 - 允許選項請求

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)"} []

所以看起來像OPTIONS請求,這是因爲CORS,因爲「允許」標題,只允許「POST」被允許發送。那麼,修復所有路線的最佳方法是什麼?

回答

1

你只需要在你的行動爲POST方法的路線:

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

如果你想回答OPTIONS請求,您必須使用@Rest\Options註釋定義選項的路線。

您可以在同一個動作上測試多個註釋,並測試動作內部的方法(對於表單動作通常使用GETPOST),或者使用相同路徑但不同方法定義兩個不同的動作。

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 debug:router |的輸出是什麼? grep -i api_security_login'應用我的建議更改後? – nifr

+0

我建議我們先找出哪些不適用於單個「OPTIONS」請求。那麼我們允許所有控制器操作/路由的選項方法。有一種簡單的方法,但我無法幫助你,如果你只是說**它不適合我**,並且在應用更改後不提供有關應用程序行爲,異常消息或命令輸出的任何信息。 – nifr