为什么使用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页面的访问地址为https://xx.ceshi.com,配置Origin-Agent-Cluster为false,并且该页面渲染时会设置document.domain = ceshi.com。
页面B地址为https://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