2017-08-29 101 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