我们在我们的网站上看到了著名的 CORS 错误:
XMLHttpRequest 无法加载https://my-site.com/api https://my-site.com/api。请求的资源上不存在“Access-Control-Allow-Origin”标头。起源 'https://my-other-site.com https://my-other-site.com' 因此不允许访问。
问题是,Access-Control-Allow-Origin
is根据预检请求正确设置...
OPTIONS https://my-site.com/api HTTP/1.1
Host: my-site.com
Access-Control-Request-Method: POST
Origin: https://my-other-site.com
Access-Control-Request-Headers: my-custom-header, accept, content-type
Accept: */*
Referer: https://my-other-site.com/
...other stuff...
HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://my-other-site.com
Access-Control-Allow-Methods: POST
Access-Control-Allow-Headers: my-custom-header, accept, content-type
Access-Control-Expose-Headers: my-custom-header
...other stuff...
……然而,这是not根据后续请求进行设置。
POST https://my-site.com/api HTTP/1.1
Host: my-site.com
Accept: */*
My-Custom-Header: abcd123
Origin: https://my-other-site.com
Referer: https://my-other-site.com/
...other stuff...
HTTP/1.1 200 OK
My-Custom-Header: abcd123
...other stuff...
我不明白这个问题。根据一切我在网上读到,如果我们使用预检请求,我们不需要为实际请求添加 CORS 标头。然而,事实显然并非如此。
所有的例子here http://www.html5rocks.com/en/tutorials/cors/ and here https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS包括一个Access-Control-Allow-Origin
实际响应中的标头,但不包含任何其他内容“必需的”CORS 标头。当我们将这一标头添加到实际响应中时,错误就会消失。
所以我的问题是,is the Access-Control-Allow-Origin
两个请求中实际上都需要标头吗?哪里有这么说?为什么这是真的?
是的,看来两个响应都应包含必要的 CORS 标头。
在这两个简单的跨源请求 http://www.w3.org/TR/access-control/#simple-cross-origin-request-0和带预检的跨源请求 http://www.w3.org/TR/access-control/#cross-origin-request-with-preflight-0,“实际请求”遵循相同的行为,检查 CORS 标头,无论预检如何(分别为步骤 1 和步骤 3)。
-
[...]应用提出请求步骤 http://www.w3.org/TR/access-control/#make-a-request-steps并观察请求规则提出请求时如下。
The 资源共享检查对于给定资源的算法如下:
如果响应包含零个或多个Access-Control-Allow-Origin http://www.w3.org/TR/access-control/#http-access-control-allow-originheader 值,返回失败并终止该算法。
[...]
预检请求仅阻止“实际请求”开始。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)