javascript-CORS和Access-Control-Allow-Header如何工作?

我试图使CORS请求从domain.com发送到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方法具有相同的路由,这就是在.domain.com之后得到的回报

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

并且.domain.com请求被取消/失败。

我的问题是,我是否还需要在POST控制器上具有access-control-allow-origin?

我有一个用于授权的Cookie,其域为.domain.com,该Cookie在请求中发送一次,并且现在不发送。 知道为什么会这样吗?

Leo Correa asked 2019-10-09T19:27:08Z
2个解决方案
79 votes

是的,您必须在OPTIONS响应和POST响应上都具有标头Access-Control-Allow-Headers: origin, content-type, acceptAccess-Control-Allow-Origin: *。 您还应该在POST响应中包含标头Access-Control-Allow-Credentials: true

您的OPTIONS响应中还应包含标题Access-Control-Allow-Headers: origin, content-type, accept,以匹配请求的标题。

monsur answered 2019-10-09T19:27:26Z
-19 votes

如果您使用PHP添加以下行

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

可能解决您的问题

user6670695 answered 2019-10-09T19:27:57Z
translate from https://stackoverflow.com:/questions/12630231/how-do-cors-and-access-control-allow-headers-work