6

我正在尝试使用 CORS 将文件上传到不同域上的服务,但由于来源被拒绝,它们一直失败。据我所见,正在使用正确的标题来允许这样做。

Javascript 请求:

  var xhr = new XMLHttpRequest();
  xhr.open('POST', "https://files.example.com", true);                                                                                                                            
  xhr.setRequestHeader('Content-Type', 'application/json');
  xhr.onreadystatechange = function () {
    if (this.status == 200 && this.readyState == 4) {
      console.log('response: ' + this.responseText);
    }
  };

  xhr.send();

来自预检 OPTIONS 请求的响应:

Access-Control-Allow-Headers:Origin, Authorization, Content-Type
Access-Control-Allow-Methods:POST, OPTIONS
Access-Control-Allow-Origin:*
Content-Length:0
Content-Type:application/json
Date:Mon, 19 Nov 2012 23:30:21 GMT

POST 请求的标头:

Cache-Control:no-cache
Content-Type:application/json
Origin:https://www.example.com
Pragma:no-cache
Referer:https://www.example.com
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/537.19 (KHTML, like     Gecko) Chrome/25.0.1325.0 Safari/537.19

导致错误:

XMLHttpRequest cannot load https://files.example.com. Origin https://www.example.com is not allowed by Access-Control-Allow-Origin.
4

4 回答 4

2

不幸的是,发布到您页面以外的域会引发 CORS。这还包括不同的子域、端口和协议 (http/https)。

当请求“不简单”时完成预检,这意味着内容类型标头设置为“text/plain”以外的内容。您的“应用程序/json”使浏览器害怕预检。

如果这 50-200 毫秒对您很重要,那么您可以重写您的 Web 服务以了解“简单”内容类型。如果不是,那么您应该让您的 Web 服务在执行 OPTIONS(http 方法)任务时返回 HTTP 状态 204(无内容)。

处理 wcf 时:

WebOperationContext.Current.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.NoContent;
于 2016-01-05T14:11:21.110 回答
1

子域不同。就 CORS 而言,子域、协议和端口在 Origin 和 Access-Control-Allow-Origin 中必须相同。

在您的示例中,来源看起来是:https ://www.example.com ,而 Access-Control-Allow-Origin 是:https ://files.example.com

于 2014-03-07T19:18:46.920 回答
0

尝试将 Cache-Control 和 Pragma 添加到预检中允许的标头列表中。完整的标题应如下所示:

Access-Control-Allow-Headers: Cache-Control, Pragma, Origin, Authorization, Content-Type
于 2012-11-20T02:28:41.010 回答
0

有点晚了,但是查看您的信息,它显示飞行前 CORS 检查工作正常,这只是响应被浏览器阻止的实际(第二次)CORS 请求。

很遗憾,您没有包含实际(第二次)CORS 请求的响应,因为这可能包含响应拒绝的线索。我的怀疑是,尽管飞行前响应正确包含标题:

Access-Control-Allow-Origin:*

...您的实际(第二次)响应可能不包含该标头,在这种情况下,浏览器会正确拒绝响应。如果我的假设是正确的,那么解决方案就是将该标头也包含在实际(非飞行前)响应中。

于 2016-06-06T09:55:04.813 回答