发出 AJAX 请求时出现“405 方法不允许”

Posted

技术标签:

【中文标题】发出 AJAX 请求时出现“405 方法不允许”【英文标题】:"405 method not allowed" when making AJAX request 【发布时间】:2020-03-19 23:40:26 【问题描述】:

我正在制作简单的待办事项应用程序,后端使用 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 操作在这里正常工作,它允许我从 db 获取所有列表

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 方法。

调试:路由器日志:

如图所示,方法发生在预期方法和端点、注册和登录检查下,其中方法未指定使用 POST 正常工作

网络错误:

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

【问题讨论】:

您需要确保服务器系统允许 OPTIONS 请求。这是与您的 CORS 配置不同的问题。如果您在 Apache 下运行 php/symphony4 设置,那么可能是 OPTIONS 请求被 Apache 阻止了;如果是这样,请参阅***.com/a/45490500/441757 的答案以获取有关如何使 Apache 允许 OPTIONS 请求的指导。 杰克,看到下面的答案了吗?有什么反馈吗? yivi 我会反馈的,稍后我现在就在工作中 【参考方案1】:

您正在发出OPTIONS 请求(这是对 CORS 的预检请求):

但我们的服务器明确告诉您,它只接受GETPOST 请求:

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

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

看起来您正在使用内置的 PHP 网络服务器,它的功能相当有限。我不知道有任何改变其配置的方法。您可以尝试在127.0.0.1 而不是localhost 上提供访问该站点的服务,这有时会使浏览器在处理 CORS 请求时更加松懈。

【讨论】:

【参考方案2】:

你可以试试这个:

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

【讨论】:

以上是关于发出 AJAX 请求时出现“405 方法不允许”的主要内容,如果未能解决你的问题,请参考以下文章

在 Spring MVC 中映射 Ajax 请求:不允许出现错误 405 方法

jQuery .ajax() POST 请求抛出 405(不允许的方法)但 GET 不会

发出 Ajax POST 请求时出现“parseerror”

发出 ajax Post 请求时出现 403 禁止错误

Grails spring security在向控制器操作发出ajax请求时出现403错误

WCF 错误:405 方法不允许