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

Posted

技术标签:

【中文标题】CORS 和 Access-Control-Allow-Headers 是如何工作的?【英文标题】:How do CORS and Access-Control-Allow-Headers work? 【发布时间】:2012-09-19 18:16:26 【问题描述】:

我正在尝试将 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 方法有相同的路由,这就是我在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 控制器上设置 access-control-allow-origin ?

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

【问题讨论】:

【参考方案1】:

是的,您需要在 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 以匹配请求的标头。

【讨论】:

协议可以省略吗?或者你可以添加一个http和https吗? 协议不能省略,必须使用域、协议和端口 Access-Control-Allow-Origin: * 不再允许。您必须手动添加标题。

以上是关于CORS 和 Access-Control-Allow-Headers 是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

以角度向谷歌表单提交数据时出现CORS问题

在 Visual Studio 开发服务器上为 Soap Web 服务启用 CORS 设置

预检响应中不允许使用方法选项

ASP.NET WebAPI2 和 AngularJS

跨域请求在 Firefox 中被阻止

Java Spring:请求的资源上不存在“Access-Control-Allow-Origin”标头