跨域AJAX预检失败原点检查

这似乎不起作用:

$.ajax({ url: "http://localhost:3000/foo.json", data: { foo: 'bar' }, headers: { 'HTTP_X_CUSTOMHEADER': 'foobar' }, xhrFields: { withCredentials: true } }); 

当我在jsfiddle上运行时, OPTIONS请求(根据Chrome调试工具)会触发,如下所示:

 Access-Control-Request-Headers: Origin, HTTP_X_CUSTOMHEADER, Accept Access-Control-Request-Method: GET Origin: http://fiddle.jshell.net 

然后(根据Chrome调试工具)我的本地服务器返回以下标头:

(手动重新格式化以便于阅读)

 Access-Control-Allow-Credentials: true Access-Control-Allow-Headers: HTTP_X_CUSTOMHEADER Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS Access-Control-Allow-Origin: http://fiddle.jshell.net Access-Control-Max-Age: 10 Cache-Control: no-cache Connection: Keep-Alive Content-Length: 1 Content-Type: text/html; charset=utf-8 Date: Wed, 14 Sep 2011 22:42:28 GMT Server: WEBrick/1.3.1 (Ruby/1.8.7/2010-01-10) X-Runtime: 2 

然后在控制台中我收到如下错误消息:

 XMLHttpRequest cannot load http://localhost:3000/foo.json?foo=bar. Origin http://fiddle.jshell.net is not allowed by Access-Control-Allow-Origin. 

Access-Control-Allow-Origin标题看起来与我的服务器响应预检请求时相同。 那么我在这里错过了什么?

OHHHHH,好吧我想出来了,最后……

显然,预检OPTIONS响应标头不是唯一需要它们的地方。 您还需要在实际内容的响应中包含这些标头。 我只有这些标题在预检上下来,认为这是唯一需要的“票”。

所以我为实际资产的GET请求添加了相同的标题,现在一切都很好。 我想我在文档中错过了。

您需要在Access-Control-Allow-Headers部分中包含Origin,因为Origin不被视为简单的标头(IMO,规范应该包括简单标头列表中的Origin)。