CORS 访问阻塞

Posted

技术标签:

【中文标题】CORS 访问阻塞【英文标题】:CORS access blocking 【发布时间】:2016-03-31 23:41:11 【问题描述】:

我可能需要一些帮助。

我试图与 XMLHttpRequest 建立从 javascript 到另一个来源的 php 脚本的连接。

我注意到的第一件事是,我从这个请求中收到了一个错误,告诉我缺少标头。我搜索了一下,发现this documentation。我修改了这样的标题:

JS

//this.mozSystem = true;
this.open("POST", url, true);
this.setRequestHeader("Content-type", "application/json");
this.setRequestHeader("ADDON-TO-SERVER", "");
this.setRequestHeader("Content-length", massage.length);
this.setRequestHeader("Connection", "close");

PHP

header("Content-type: application/json");
header("Access-Control-Allow-Origin: *");
header("Access-Control-Request-Method: POST");
header("Access-Control-Allow-Headers: ADDON-TO-SERVER,Content-type");

而且它有效......但我不知道为什么在

header("Access-Control-Allow-Headers: ADDON-TO-SERVER,Content-type");

需要Content-type

Mozilla 告诉我添加这个,但我认为它只需要一个自定义标题,Content-type 不是基本的吗?

谁能告诉我为什么需要这样做,并告诉我我是否按照预期做了所有事情。

感谢您的帮助, 费雷尔

【问题讨论】:

【参考方案1】:

就 CORS 上下文中的标头而言,值为 application/jsonContent-type 请求标头不被视为“基本标头”(借用您的措辞)。

在 CORS 上下文中,Content-type 请求标头仅在其值为 application/x-www-form-urlencodedmultipart/form-datatext/plain 时才被视为“基本”。

因此,只有当您发送该请求的服务器明确表示可以接收此类请求时,您的浏览器才会允许来自您的 Web 应用程序的 Content-type: application/json 请求按预期工作。服务器执行此操作的方式是使用包含Content-typeAccess-Control-Allow-Headersheader 响应。

您的浏览器强制执行该限制的基本原理是,除非服务器明确指出可以处理某些类型的跨域请求,否则 CORS 不会允许 Web 应用程序执行任何类型的编程跨域请求除了基本的 html form-element 操作始终能够进行跨域之外的任何事情。

因此,自从 CORS 出现之前,HTML 页面一直仅限于发送 application/x-www-form-urlencodedmultipart/form-datatext/plain 跨域请求,这就是基本 CORS 行为的限制,除非服务器选择- 了解更多。

【讨论】:

啊,好吧,这是有道理的,所以我必须列出任何其他不正常的标头,所以服务器甚至考虑请求?您对表单的原始行为的添加使这更容易理解,谢谢! 是的,基本上,如果您在请求中添加任何自定义标头(除了您的浏览器自行发送的标头之外),它只会在您请求的服务器表明可以接收这些请求时才有效标题。

以上是关于CORS 访问阻塞的主要内容,如果未能解决你的问题,请参考以下文章

localhost webapp 上的本地开发和 Cors 策略阻止的 localhost 访问

访问被 CORS 策略阻止:没有“访问控制允许来源”

CORS 策略已阻止从源对 X 的 XMLHttpRequest 的 CORS 访问

基于CORS的GeoServer跨域访问策略

访问 XMLHttpRequest 时访问 XMLHttpRequest 已被 CORS 策略阻止

CORS 策略已阻止对 XMLHttpRequest 的访问