Access-Control-Allow-Origin不允许Origin,但定义了通配符?

时间:2013-04-24 12:03:41

标签: jquery ajax cors

我正在开发一个项目(前端),它将与另一个域中的另一个(API)进行通信。

目前,我正在本地工作,使用此配置:

  • 前端http://127.0.0.1:9000
  • API http://127.0.0.1:9100

在我的API程序中,我定义了一个OPTIONS请求,它返回这些标头以及HTTP状态代码200:

Access-Control-Allow-Headers:accept, origin, x-requested-with, content-type
Access-Control-Allow-Methods:GET, POST, PUT, DELETE, OPTIONS
Access-Control-Allow-Origin:*
Access-Control-Max-Age:15
Content-Length:0

使用jQuery,我向这个url发出Ajax请求。例如,这是OPTIONS查询的Request标头:

Accept:*/*
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
Access-Control-Request-Headers:accept, origin, x-requested-with, content-type
Access-Control-Request-Method:POST
Connection:keep-alive
Host:127.0.0.1:9100
Origin:http://127.0.0.1:9000
Referer:http://127.0.0.1:9000/login
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.63 Safari/537.31

这是成功的(状态代码:200 OK),然后按预期对http://127.0.0.1:9100/auth/login进行POST,但我在网络面板中得到了这个:

  

状态:已取消|类型:待定

如果我查看控制台,我收到此错误:

  

XMLHttpRequest无法加载http://127.0.0.1:9100/auth/login。 Access-Control-Allow-Origin不允许原点http://127.0.0.1:9000

但是,正如我们所看到的,Access-Control-Allow-Origin被定义为“*”。我还尝试将其更改为“127.0.0.1:9000”和“http://127.0.0.1:9000”,控制台上也出现相同的错误。

现在,关于我的jQuery ajax命令的一些细节。 ajax本身很简单:

jQuery.ajax({
    'url': '/auth/login',
    'type': 'POST',
    'data': {'login': 'abc', 'password': 'def'},
    'timeout': 15000
}).done(function (data, status, xhr) {
    console.log ('ok');
}).fail(function (xhr, status, description) {
    console.error('oups');
});

但是,通过jQuery.ajaxPrefilter方法添加API的基本URL:

jQuery.ajaxPrefilter (function (options) {
    var url = document.createElement('a');
    url.href = options.url;
    options.url = 'http://127.0.0.1:9000' + url.pathname;
});

这是为了避免在URL更改时更改多个文件。 我不知道这是否是问题的根源,但到目前为止,即使关于CORS配置的一切看起来都没问题,我也无法使POST请求正常工作。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

好的答案其实很简单,但你需要知道。

Headers不仅可以在OPTIONS请求中使用,而且可以在所有请求中使用(甚至是GET / POST / PUT / DELETE请求)。

这就是为什么它不适合我。