portal.example.com
上。<script>
标记,用于加载从assets.example.com
提供的来源。admin.example.com
由于CORS飞行前失败,此API请求出错。
Failed to load http://admin.example.com/v0/user/navigation: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://portal.example.com' is therefore not allowed access.
实际的OPTIONS
请求如下
OPTIONS /v0/user/navigation HTTP/1.1
Host: admin.example.com
Connection: keep-alive
Access-Control-Request-Method: GET
Origin: http://portal.example.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36
Access-Control-Request-Headers: authorization,x-correlation-id,x-user-domain
Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9,en-GB;q=0.8
实际的OPTIONS
响应如下
HTTP/1.1 200
Allow: GET
Access-Control-Allow-Headers: authorization,x-correlation-id,x-user-domain
Access-Control-Allow-Methods: GET
Access-Control-Allow-Origin: http://portal.example.com
Vary: Origin
Content-Length: 0
Date: Tue, 20 Feb 2018 12:12:19 GMT
Set-Cookie: 97d2c19dadc3933a73dce9bec0748df1=5a15895c5e0f5b526c177132cb4aa666; path=/; HttpOnly
Cache-control: private
X-RBT-SCAR: 10.127.48.7:777511903:1000
我认为问题是因为请求实际来自assets.example.com
提供的脚本正在发出请求。所以我应该在Access-Control-Allow-Origin: http://assets.example.com
回复中返回OPTIONS
。但是,我遵循了W3C的建议。
Access-Control-Allow-Origin标头指示是否可以通过返回Origin请求标头的值来共享资源,&#34; *&#34;或&#34; null&#34;在回应中。
我是误解CORS,还是浏览器发送主执行URL的Origin
而不是发出请求的脚本的URL?
已更新
获得回应
HTTP/1.1 200
X-Correlation-Id: 8978b245-081a-4c4a-b4c9-73f2920ab55c
Content-Type: application/vnd.example+json
Transfer-Encoding: chunked
Date: Tue, 20 Feb 2018 13:22:39 GMT
Set-Cookie: 97d2c19dadc3933a73dce9bec0748df1=dc4e3543c3071d752959e7176c5e4d29; path=/; HttpOnly
Cache-control: private
X-RBT-SCAR: 10.127.48.7:778160108:2000
答案 0 :(得分:5)
No 'Access-Control-Allow-Origin' header is present on the requested resource.
这意味着&#39; Access-Control-Allow-Origin&#39;标题丢失,而不是您的域名不被允许。
如果您没有获得许可,您会看到类似
的内容 The 'Access-Control-Allow-Origin' header has a value 'http://www.example.com' that is not equal to the supplied origin.
因此,要解决您的问题,您需要配置GET
响应,以提供必要的CORS标头以及OPTIONS
响应。
在您编辑的问题中,GET
回复标题并未为Access-Control-*
提供任何内容,以便您收到错误!
答案 1 :(得分:1)
您的CORS预检不失败 - 您获得200响应和所有必需的CORS响应标头...
但是,您没有在GET响应中返回任何CORS响应标头 - 是失败的。至少,您需要返回一个Access-Control-Allow-Origin
响应标头,该标头与OPTIONS响应中返回的标头相匹配。
所以,只需将此信息包含在您的GET回复中,您就可以了:
Access-Control-Allow-Origin: http://portal.example.com
最后,浏览器会添加Origin
请求标头,并相信我 - 它是正确的。但是,发送的值并不重要,因为所需要的只是Access-Control-Allow-Origin
响应标头匹配 Origin请求标头(或者通过具有&#39; *&#39;或与Origin值完全匹配的值。)