Access-Control-Allow-Headers不允许使用Ajax Request头字段

时间:2014-10-07 19:06:50

标签: ajax cors dotnetnuke

尝试构建DNN服务框架WebAPI,但我在使用CORS时遇到了麻烦。我有所有合适的标题(我认为),但它似乎仍然无法正常工作。

错误:

XMLHttpRequest cannot load http://www.dnndev.me/mysite/builder/API/echo?message=Hello+World&_=1412707749275. Request header field Key is not allowed by Access-Control-Allow-Headers.

请求标题:

Remote Address: 127.0.0.1:80
URL: http://www.dnndev.me/mysite/builder/API/echo?message=Hello
Request Method: OPTIONS
Status Code: 200 OK
Accept: */*
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Access-Control-Request-Headers: accept, key
Access-Control-Request-Method: GET
Connection: keep-alive
Host: www.dnndev.me
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36

响应标题:

Access-Control-All-Headers: Origin, X-Requested-With, Content-Type, Accept, Key
Access-Control-Allow-Methods: *
Access-Control-Allow-Origin: *
Cache-Control: no-cache
Content-Length: 13
Content-Type: application/json; charset=utf-8
Date: Tue, 07 Oct 2014 18:49:10 GMT
Expires: -1
Pragma: no-cache
Server: Microsoft-IIS/7.5

通常,此错误是由于在“访问控制所有标头”中没有适当的标头引起的。但是,我发送正确的响应以允许ajax继续其请求。它只是拒绝。

这是我对方法的ajax调用:

$.ajax({
    type: 'GET',
    url: 'http://www.dnndev.me/mysite/builder/API/echo',
    dataType: 'json',
    data: { message: 'Hello' },
    crossDomain: true,
    headers: { 'Key': 'Bearer 7680ff6e-1362-4236-a9cd-c6bc8b6f13ea' },
    success: function (result) { console.log(result); }
});

可能很明显,但这只发生在跨域请求上,并且仅当我包含自定义标头时(因此执行ajax来执行OPTIONS)。

3 个答案:

答案 0 :(得分:22)

您的服务器使用以下自定义标头响应预检请求:

Access-Control-All-Headers: Origin, X-Requested-With, Content-Type, Accept, Key

如果您(或撰写此服务器的人)仔细阅读CORS,他应该回复:

Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Key

现在,客户端客户端可以继续使用Key自定义标头。

话虽如此,Bearer非常特定于OAuth 2,它在整个Authorization标头中发送。使用Key似乎是对RFC和内容以及轮子重新发明的可怕违反。

答案 1 :(得分:2)

请注意Nyx的问题以及达林的回答中的拼写错误(' ow'缺失)。所以它是

Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Key

它解决了错误消息'请求标题字段 some-header-field 在预检模式下不允许使用Access-Control-Allow-Headers,如果作为回答浏览器的OPTION请求。

答案 2 :(得分:2)

将此添加到服务器响应标头:

header('Access-Control-Allow-Headers:Origin,Content-Type,X-Auth-Token,Authorization');