跨域AJAX预检失败原点检查

Ale*_*yne 9 javascript ajax jquery cors

这似乎不起作用:

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

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

Access-Control-Request-Headers: Origin, HTTP_X_CUSTOMHEADER, Accept
Access-Control-Request-Method:  GET
Origin:                         http://fiddle.jshell.net
Run Code Online (Sandbox Code Playgroud)

然后(根据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
Run Code Online (Sandbox Code Playgroud)

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

XMLHttpRequest cannot load http://localhost:3000/foo.json?foo=bar.
Origin http://fiddle.jshell.net is not allowed by Access-Control-Allow-Origin.
Run Code Online (Sandbox Code Playgroud)

但是Access-Control-Allow-Origin标题看起来与我的服务器响应预检请求时相同.那么我在这里想到的这个难题是什么?

Ale*_*yne 4

呵呵,好吧,我终于明白了……

显然是起飞前OPTIONS响应标头并不是唯一需要它们的地方。您还需要在实际内容的响应中包含这些标头。我只在飞行前才看到这些标题,认为这是唯一需要的“票”。

因此,我将相同的标头添加到实际资产的 GET 请求中,现在一切正常。我想我在文档中错过了这一点。

  • 您能说得更详细一些吗?我陷入 CORS 地狱:http://stackoverflow.com/questions/13318436/https-access-control-allow-origin-not-working-no-matter-what-with-php-5-3-apac (2认同)