所以我一直在使用fetch一段时间没有任何问题。我已经创建了大量的API,并且必须在多个API中实现CORS。
然而,今天我似乎无法让CORS适用于单个补丁请求。它适用于get / post / delete而没有问题,但补丁不起作用。
我已阅读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
}
})
}
服务器的.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
任何人对我在这里做错了什么有任何想法?
答案 0 :(得分:1)
实际上,当我们向服务器端发送一个不简单的cors请求时,比如DELETE/ PUT / PATCH
,但不包含POST/GET/HEAD
,浏览器会向服务器发送一个OPTIONS
请求(预检)一边再问是否支持METHOD/ORIGIN/HEADERS
,所以如果只指定PATCH请求允许的方法是不够的。
这是我的示例代码,只是为了这个问题,可能不太优雅,希望你不要介意......
app.patch('/cors', (req, res) => {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Content-Type,Content-Length,Server,Date,access-control-allow-methods,access-control-allow-origin");
res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS,PATCH");
res.send('ok')
})
app.options('/*', (req, res) => {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Content-Type,Content-Length,Server,Date,access-control-allow-methods,access-control-allow-origin");
res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS,PATCH");
res.send('send some thing whatever')
})