为什么设置document.domain,跨域依旧报错?

328 阅读2分钟

为什么使用document.domain?        

        通常我们通过设置document.domain,让两个页面具有相同的domain值,来实现跨域。例如可以使用window.opener来获取打开该页面的window对象或者window.parent获取父窗口对象,实现跨页面通信。

为什么document.domain无法设置值?如何解决?

        谷歌浏览器明确在115版本后将会禁用document.domain的值修改。如果你访问的协议是https,那么你将无法设置document.domain,并且给出提示如下图所示:

​编辑

         于此,建议大家使用postMessage来实现跨域通信。或者使用最终方法,在访问文档的响应头部使用:

Origin-Agent-Cluster: ?0

        这个头部可以在服务程序中返回或者在直接代理服务器例如nginx配置返回头部。上面?0 是布尔值false的结构化语法,个人认为在nginx配置比较简单。

注:

        响应头部如果返回多个Origin-Agent-Cluster是无法生效的!

为什么document.domain相同还是无法跨域?

        如果出现document.domain相同还是无法跨域,那么多半是你其中一个页面的Origin-Agent-Cluster是true。

        例如:

        A页面的访问地址为xx.ceshi.com,配置Origin-Agent-Cluster为false,并且该页面渲染时会设置document.domain = ceshi.com。

        页面B地址为ceshi.com,该页面设置Origin-Agent-Cluster为true(https协议在高版本浏览器,默认会被识别为true)。
这时在A页面打开页面B,B页面跨域通信仍会报错。

        为什么?我们来看看这一段话。        ​编辑

        所以Origin-Agent-Cluster为true时,浏览器会为这些以源为键的新代理集群提供自己的专用资源,这些资源不会与其他源的资源组合在一起,无法实现跨域,此时需要将A页面的Origin-Agent-Cluster头部也设置为false,此时能解决跨域报错。

注:

        我们可以使用window.originAgentCluster来获取Origin-Agent-Cluster是否设置成功。

大家有兴趣也可以看看如下资源:

1、Chrome disables modifying document.domain

2、Microsoft Edge 将禁用修改 document.domain

3、Origin-Agent-Cluster的作用