CORS和Access-Control-Allow-Headers如何工作?

我正在尝试使CORS请求从domain.com POST到a.domain.com。

我的JavaScript看起来像这样

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

起初,我看到OPTIONS路线被这样调用:

 Request URL: https://a.domain.com/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.com Origin:http://domain.com:3000 Referer:http://domain.com:3000/home 

选项响应

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

这个要求回来了200像说的。 在我的服务器上,我有与POST方法相同的路由,这是我得到的OPTIONS后的回报

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

发布请求

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

POST请求被取消/失败。

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

我有一个cookie的授权,有域.domain.com该cookie发送一次请求中,它不是现在发送。 任何想法为什么会发生?

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

你的OPTIONS响应还应该包含头部Access-Control-Allow-Headers: origin, content-type, accept匹配请求的头。

如果您使用PHP添加以下行

 header ( " Access -Control- Allow-Origin : *") ; header ( " Access- Control-Allow -Headers : *") ; 

可能解决你的问题