提出AJAX请求时,“不允许405方法”

时间:2019-11-24 14:56:21

标签: php symfony cors symfony4

我正在制作简单的待办事项应用程序,后端是Symfony 4,前端是Vue.js。

由于其他一些端点正常工作,由于未知原因,我收到405错误状态。

这是我的listController的一部分:

/**
 * @return \FOS\RestBundle\View\View
 */
public function getListsAction()
{
    $data = $this->taskListRepository->findAll();
    return $this->view($data, Response::HTTP_OK);
}


/**
 * @Rest\RequestParam(name="title", description="Title of the list", nullable=false)
 * @param ParamFetcher $paramFetcher
 * @return \FOS\RestBundle\View\View
 */
public function postListsAction(ParamFetcher $paramFetcher)
{
    $title = $paramFetcher->get('title');
    if ($title) {
        $list = new TaskList();
        $preferences = new Preference();
        $preferences->setList($list);
        $list->setPreferences($preferences);
        $list->setTitle($title);
        $this->entityManager->persist($list);
        $this->entityManager->flush();
        return $this->view($list, Response::HTTP_CREATED);
    }
    return $this->view(['title' => 'This cannot be null'], Response::HTTP_BAD_REQUEST);
}

get操作在这里正常工作,它使我可以从数据库获取所有列表

nelmio_cors.yaml文件:

nelmio_cors:
    defaults:
        origin_regex: true
        allow_credentials: true
        allow_origin: ['%env(CORS_ALLOW_ORIGIN)%']
        allow_methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS']
        allow_headers: ['Content-Type', 'Authorization', 'origin', 'Accept', 'bearer', 'Allow']
        expose_headers: ['Link']
        max_age: 3600
    paths:
        '^/': ~

如您所见,允许使用POST方法。

debug:路由器日志: enter image description here

如图所示,该方法出现在预期的方法和端点,注册和login_check下,其中未指定使用POST正常工作的方法

网络错误:

enter image description here

在控制台中,我收到CORS错误。

2 个答案:

答案 0 :(得分:1)

您正在发出OPTIONS请求(这是CORS的飞行前请求):

  

request headers

但是我们的服务器清楚地告诉您,它仅接受GETPOST请求:

  

response headers

您需要更改您的网络服务器配置(Apache,Nginx,无论使用什么),以便它也接受OPTIONS请求。

Pre-flight requests在某些情况下由浏览器自动发出,这说明了为什么某些端点正常工作,而不是这个端点正常工作。

您似乎正在使用内置的PHP Web服务器,但功能有限。我不知道有任何更改其配置的方法。您可以尝试在127.0.0.1而不是localhost上提供对网站的访问服务,这有时会使浏览器对CORS请求的要求不高。

答案 1 :(得分:-1)

您可以尝试以下方法:

  1. 确保通过以下方式激活apache标头模块:a2enmod headers
  2. 要允许网络服务器接受OPTIONS(因为检查CORS需要使用OPTIONS),请将其添加到您的.htaccess中,例如:Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"