CORS 和访问控制允许头是如何工作的?

我正在尝试使 CORS 请求从 domain.examplea.domain.example

我的 JavaScript 是这样的

$('#fileupload').fileupload({
xhrFields: {
withCredentials: true
},
dataType: 'json',
url: $('#fileupload').data('path'),
singleFileUploads: true,
add: function(e, data){
data.submit();
}
});

起初,我看到期权路线被这样称呼:

Request URL: https://a.domain.example/some/route
Request Method:OPTIONS
Status Code:200 OK

请求选项:

Access-Control-Request-Headers:origin, content-type, accept
Access-Control-Request-Method:POST
Host:a.domain.example
Origin:http://domain.example:3000
Referer:http://domain.example:3000/home

选择回应

Access-Control-Allow-Credentials:true
Access-Control-Allow-Methods:POST
Access-Control-Allow-Origin:http://domain.example:3000
Connection:keep-alive
Content-Length:0
Content-Type:text/html;charset=utf-8

这个请求会返回一个200美元。在我的服务器上,我有相同的路由与 POST方法,这是我得到的回报后,OPTIONS

Request URL:https://a.domain.example/some/route

请求后

Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryjwr5Pk7WBcfzMdbO
Origin:http://domain.example:3000
Referer:http://domain.example:3000/home

POST请求被取消/失败。

我的问题是,我是否需要在 POST 控制器上也有访问控制允许原点?

我有一个用于授权的 Cookie,其域 .domain.example,Cookie 在请求中被发送过一次,现在还没有被发送。知道为什么会这样吗?

165394 次浏览

是的,在 OPTION 响应和 POST 响应中都需要头 Access-Control-Allow-Origin: http://domain.example:3000Access-Control-Allow-Origin: *。您还应该在 POST 响应中包含头 Access-Control-Allow-Credentials: true

选项响应还应包括与请求的标头匹配的标头 Access-Control-Allow-Headers: origin, content-type, accept