不允许获取 PATCH 请求 (CORS)

Ron*_*oeg 6 javascript cors fetch-api

所以我已经使用 fetch 一段时间了,没有任何问题。我创建了大量 API,并且必须在多个 API 中实现 CORS。

然而,今天我似乎无法让 CORS 为单个补丁请求工作。它适用于获取/发布/删除,没有问题,但补丁不起作用。

我已经读过fetch patch request is not allowed,遗憾的是我已经编写了完全大写的补丁,所以这对我来说不是一个解决方案。

我的请求:

{
  method: 'PATCH', //using POST here makes everything work fine.
  json: true,
  headers: defaultHeaders,
  body: JSON.stringify({
    type: 'analytics_analyzers',
    attributes: {
      status: active ? 1 : 2,
      ssid: getState().config.ssid
    }
  })
}
Run Code Online (Sandbox Code Playgroud)

以及服务器的 .htaccess 文件:

SetEnvIf Origin "http(s)?://(www\.)?    (whitelistUrl1|whitelistUrl2|whitelistUrl3)$" AccessControlAllowOrigin=$0
Header always set Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
Header always set Access-Control-Allow-Credentials true

SetEnvIf Access-Control-Request-Headers ".*" AccessControlHeaders=$0
Header always set Access-Control-Allow-Headers: %{AccessControlHeaders}e env=AccessControlHeaders

SetEnvIf Access-Control-Request-Method ".*" AccessControlMethod=$0
Header always set Access-Control-Allow-Methods: %{AccessControlMethod}e env=AccessControlMethod
Run Code Online (Sandbox Code Playgroud)

选项请求 错误消息

有人对我在这里做错了什么有任何想法吗?

小智 1

事实上,当我们向服务器端发送一个不简单的cors请求时,比如DELETE/ PUT / PATCH,但不包括POST/GET/HEAD,浏览器会OPTIONS 向服务器端发送一个请求(预检),然后询问是否支持METHOD/ORIGIN/HEADERS,所以如果你只是指定允许PATCH请求方法还不够。

\n

这是我的示例代码,只是针对这个问题,可能不太优雅\xef\xbc\x8chope,你没关系......

\n
app.patch('/cors', (req, res) => {\n  res.header("Access-Control-Allow-Origin", "*");\n  res.header("Access-Control-Allow-Headers", "Content-Type,Content-Length,Server,Date,access-control-allow-methods,access-control-allow-origin");\n  res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS,PATCH");\n  res.send('ok')\n})\n\napp.options('/*', (req, res) => {\n  res.header("Access-Control-Allow-Origin", "*");\n  res.header("Access-Control-Allow-Headers", "Content-Type,Content-Length,Server,Date,access-control-allow-methods,access-control-allow-origin");\n  res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS,PATCH");\n  res.send('send some thing whatever')\n})\n\n
Run Code Online (Sandbox Code Playgroud)\n