我正在开发一个项目(前端),它将与另一个域中的另一个(API)进行通信。
现在,我在本地工作,配置如下:
- 前端:
http://127.0.0.1:9000
- 接口:
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 查询的请求标头:
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 进行了 POST,但我在我的网络面板中得到了这个:
状态:已取消 | 类型:待定
如果我查看控制台,我会收到此错误:
XMLHttpRequest 无法加载
http://127.0.0.1:9100/auth/login
。Access-Control-Allow- Originhttp://127.0.0.1:9000
不允许 Origin。
但是,正如我们所见,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');
});
但是 API 的基本 URL 是在之后通过 jQuery.ajaxPrefilter 方法添加的:
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 请求正常工作。
我做错什么了 ?