访问控制允许方法

Posted

技术标签:

【中文标题】访问控制允许方法【英文标题】:Access-Control-Allow-Methods 【发布时间】:2020-04-24 09:24:43 【问题描述】:

我正在从我的前端发出以下 HTTP 请求。我所有的GET 请求都以相同的方式工作,但以下UPDATE 失败:

访问获取地址 '127.0.0.1/后端/路径' 来自原点“http://localhost:3000”已被 CORS 策略阻止: Access-Control-Allow-Methods 不允许方法 UPDATE 预检响应。

前端请求

return fetch(
      `127.0.0.1/backend/path`,
      
        method: "UPDATE",
        body: JSON.stringify(newClass),
        headers: 
          "Access-Control-Allow-Origin": "*",
          "Access-Control-Allow-Methods":
            "GET, POST, PUT, DELETE, OPTIONS, UPDATE",
          "Access-Control-Allow-Headers": "Origin, Content-Type, X-Auth-Token",
          "Content-Type": "application/json",
          Authorization: "Bearer " + getState().authToken
        
      
    )

后端 Flask 端点

@app.route('/backend/path', methods=['UPDATE'])
@authenticate
def update_data():
    return "data": "has been updated"

This answer 建议添加一个Access-Control-Allow-Methods 标头,但这已经在我的请求中出现了!我也不只是想为我的浏览器关闭 CORS,因为我需要正确实现它。

【问题讨论】:

后端必须发送 CORS 标头,哈哈。我也从未听说过 UPDATE http 方法。 Access-Control-Allow-Methods 必须在 OPTIONS response 标头中。将其添加到请求标头中不会影响后端的权限。 这些标头是 response 标头,而不是请求标头。查看关于 CORS 的许多问题。 这能回答你的问题吗? Always got Method DELETE is not allowed by Access-Control-Allow-Methods in preflight response 再次仔细阅读答案。答案是讨论将标头添加到服务器端代码。 【参考方案1】:

Access-Control-Allow-Methods 必须在 OPTIONS response 标头中。请记住,后端控制如何访问它。您不能简单地通过请求来添加允许的方法。

另外,UPDATE 不是标准的 HTTP 动词。你是说PUT 还是PATCH

【讨论】:

感谢您清理我的 CORS 困惑。 flask-cors 已经将这些标头添加到响应中,所以我只需要将它们从我的请求中删除即可。我绝对是指PUT,不确定UPDATE 来自哪里。事实上,只需切换 UPDATE->PUT 即可完全修复错误。再次感谢!

以上是关于访问控制允许方法的主要内容,如果未能解决你的问题,请参考以下文章

允许角色和策略访问控制器操作

HTTP响应标头中“允许”和“访问控制允许方法”之间的区别?

ExpressJS Post 方法 - 无访问控制允许来源

apollo-server-micro:响应缺少标头“访问控制允许方法:POST”

swift - 访问控制

如何添加访问控制允许来源?