预检响应中的 Access-Control-Allow-Methods 不允许方法 DELETE

Posted

技术标签:

【中文标题】预检响应中的 Access-Control-Allow-Methods 不允许方法 DELETE【英文标题】:Method DELETE is not allowed by Access-Control-Allow-Methods in preflight response 【发布时间】:2017-01-11 18:29:21 【问题描述】:

我正在尝试发出 DELETE ajax 请求,但我似乎无法使其工作。当我使用 POSTMAN 制作它时,它可以工作。这是我的代码:

这是我的请求,使用 jQuery 的 .ajax() 方法:

$.ajax(
    url: imageUrl,
    type: 'DELETE',
    crossDomain: true
);

在服务器上,使用 node.js + express 构建的不同应用程序,我有:

app.use(function(req, res, next) 
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    next();
);

最后,这些是我的请求、请求标头和响应标头:

请求

Request URL:http://original/request/url
Request Method:OPTIONS
Status Code:200 OK
Remote Address:75.126.137.93:80 

请求标头

Accept:*
Accept-Encoding:gzip, deflate, sdch
Accept-Language:pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4,es;q=0.2,gl;q=0.2
Access-Control-Request-Headers:
Access-Control-Request-Method:DELETE
Connection:keep-alive
Host:fs.bvodola.webfactional.com
Origin:http://localhost:3000
Referer:http://localhost:3000/landing/admin/add-page
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/52.0.2743.116 Safari/537.36

响应标头

Access-Control-Allow-Headers:Origin, X-Requested-With, Content-Type, Accept
Access-Control-Allow-Origin:*
Allow:GET,HEAD,DELETE
Connection:keep-alive
Content-Length:15
Content-Type:text/html; charset=utf-8
Date:Sat, 03 Sep 2016 23:34:17 GMT
ETag:W/"f-W+bYAIA7Bs2GwQecFLp1SA"
Server:nginx
X-Powered-By:Express

控制台 我得到以下信息:

XMLHttpRequest 无法加载 http://original/request/url。。

我该如何解决这个问题? 在一些 *** 问题上,我读到 Access-Control-Allow-Headers 必须与 Access-Control-Request-Headers 相同。但是当我尝试在 jQuery 请求上设置它时,我在控制台上得到以下信息:

拒绝设置不安全的标头“Access-Control-Request-Headers”

有什么想法可能是错的吗?谢谢!


我查看了以下 *** 问题,但找不到答案:

DELETE is not allowed by Access-Control-Allow-Methods Always got Method DELETE is not allowed by Access-Control-Allow-Methods in preflight response Access-Control-Allow-Origin in preflight response doesn't enable cross-domain access Request header field Access-Control-Allow-Headers is not allowed by Access-Control-Allow-Headers

【问题讨论】:

CORS 标头设置在响应标头中,而不是在请求标头中。 嗨,@Developer,从我的 $.ajax() 调用中可以看出,我没有在请求中设置标头。我只是尝试了一下,因为我不知道还能做什么,但很快发现这不是正确的方法。 明白了。您能否尝试在响应标头中设置允许的方法? Access-Control-Allow-Methods 到“*”或您希望允许以逗号分隔的特定方法? @Developer,我首先将Access-Control-Allow-Methods 设置为'*',但它不起作用。但后来我将它设置为“GET、POST、PUT、DELETE”(这是我想要允许的方法),它终于奏效了。 =)谢谢,伙计!我对响应的 Allow 标头感到困惑(如您所见,DELETE 在那里)并忘记了 Access-Control-Allow-Methods。如果你想把它作为答案发布,我一定会把它标记为正确的。 很高兴我能帮上忙。干杯 【参考方案1】:

在响应标头中添加Access-Control-Allow-Methods,并使用您希望允许的方法以逗号分隔:'GET, POST,DELETE...'

【讨论】:

res.header("Access-Control-Allow-Methods", "GET, POST, DELETE");

以上是关于预检响应中的 Access-Control-Allow-Methods 不允许方法 DELETE的主要内容,如果未能解决你的问题,请参考以下文章

预检响应没有 HTTP ok 状态。 Angular 6 中的 403

OAuth 中的 CORS:对预检请求的响应未通过访问控制检查

预检响应中的 Access-Control-Allow-Headers 不允许授权

预检响应中的 Access-Control-Allow-Headers 不允许请求标头字段内容类型

预检响应中的 Access-Control-Allow-Header 中的允许请求标头字段

预检响应中的 Access-Control-Allow-Methods 不允许方法 PATCH