首页 > 解决方案 > 为什么同源策略会在本地域上阻止此 javascript 调用?

问题描述

我有一个在http://mysite.local/上运行的本地开发站点(它是一个安装了Grappelli 的 Django 管理站点,如果有任何相关性的话)。

管理站点为某些操作打开一个弹出窗口(即通过showRelatedObjectLookupPopup()

由于之前与相同来源策略的类似问题(在生产中,管理站点从 CDN 域加载一些 URL,这可以触发它)我们有一个“规范化器”JS 函数,它明确设置:

document.domain = "mysite.local";

在页面加载时,在父级和弹出窗口中。

弹出窗口包含一个带有 onclick 处理程序的链接,该处理程序在父级中触发 JS 函数:

onclick="opener.dismissRelatedLookupPopup(window, '422'); return false;"

在 Chrome 或 FF 中单击此链接会导致类似的浏览器错误:

访问跨域对象上的属性“dismissRelatedLookupPopup”的权限被拒绝

或者

阻止具有源“ http://mysite.local ”的框架访问跨域框架。

弹出窗口和打开程序 URL 共享相同的协议、域和端口。

这只是本地域上的问题。在 dev/uat/production 站点(即 dev.mysite.com)上,所有这些站点的域都通过上述“normaliser”函​​数设置为超级域“mysite.com”,弹出窗口可以成功调用 JS 函数父母。

是什么阻止了它在本地域上?我错过了什么?

标签: javascriptsame-origin-policy

解决方案


根据@charlietfl 的原始建议,切换本地域似乎确实解决了这个问题。它现在在本地运行local.mysite.com而不是mysite.local,并且同源错误已经消失。我仍然不清楚是什么触发了错误(是因为域只有两个部分而不是三个部分吗?它是否特定于以“.local”结尾的域?)但万一其他人绊倒就这一点,这就是为我解决的问题。


推荐阅读