我试图了解整个CORS政策是如何运作的。为了解释我的困惑,让我举个例子:
$.get("https://www.google.com", function(response) { alert(response) });
上述请求将返回,并显示以下错误:
XMLHttpRequest无法加载https://www.google.com/。从' https://www.google.com/'重定向到' https://www.google.ca/?gfe_rd=cr&ei=TlqUWeGEH5HRXqW6utgI'被CORS政策阻止:No' Access-Control-Allow-Origin'标头出现在请求的资源上。起源' https://fiddle.jshell.net'因此不允许访问。
现在为了让它发挥作用,谷歌必须列入https://fiddle.jshell.net
白名单。
现在,如果我在一个宁静的API页面上尝试同样的事情,那就行了。我的问题很简单,为什么?
尝试分析这一点,我尝试点击API并分析其响应:
响应:
HTTP/1.1 200
Date:
Wed, 16 Aug 2017 14:31:32 GMT
Content-Length: 266
Connection: keep-alive
Content-Type: application/json; charset=utf-8
Server: Apigee Router
X-Content-Type-Options: nosniff
我得出的结论是它必须是标题。具体来说,我相信它是这个标题:Content-Type: application/json;
但我不确定,我正在努力理解这一点,并希望有人可以向我解释。
答案 0 :(得分:1)
所以我做了2次测试:从控制台运行代码function e3_add_query_vars($vars) {
$vars[] = 'as';
$vars[] = 'bs';
return $vars;
}
add_filter( 'query_vars', 'e3_add_query_vars' );
代码段并从https://apigee.com/console/others
$.get("https://www.google.com", function(response) { alert(response) });
我认为在第一种情况下发生的事情是请求是从客户端完成的,下一个请求头被发送:
https://www.google.com
由于Google不回复:authority:www.google.com
:method:GET
:path:/?_=1502896196820
:scheme:https
accept:*/*
accept-encoding:gzip, deflate, br
accept-language:en-US,en;q=0.8
origin:https://stackoverflow.com
referer:https://stackoverflow.com/questions/45717044/understanding-page-response
user-agent:Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3187.0 Safari/537.36
x-chrome-uma-enabled:1
x-client-data:CJG2yQEIo7bJAQiMmMoBCKudygEIs53KAQjRncoBCKiiygE=
- 客户端,并且在请求中我'Access-Control-Allow-Origin: *'
,因此我的Chrome会抛出CORS错误。
在第二次测试中,使用https://apigee.com/console/others并请求origin:https://stackoverflow.com
,apigee.com似乎会覆盖标题并发送:
https://www.google.com
另外,从DEV控制台,我可以看到它服务器到服务器的调用,所以没有客户参与抛出CORS,因此我收到了Google页面的回复。
<强>更新强>
关于JSON API请求,以下是Google CloudPlatform关于CORS的一些有趣信息
注意:CORS配置仅适用于XML API请求。对于JSON API请求,云存储返回Access-Control-Allow-Origin 带有请求来源的标题。
因此,如果请求是从客户端执行的,则客户端不应抛出CORS错误,因为它获取的Access-Control-Allow-Origin与它发送的源相同。
但是,不同的API和客户端可能会以不同方式处理请求。因此,有时Firefox会抛出CORS,而Chrome则不会。