为什么 same-origin-policy 在本地域上阻止此 javascript 调用?
Why is same-origin-policy blocking this javascript call on a local domain?
我在 http://mysite.local/ 上有一个本地开发站点 运行
(这是一个安装了 Grappelli 的 Django 管理站点,如果有任何相关性的话)。
管理站点为某些操作打开弹出窗口 window(即通过 showRelatedObjectLookupPopup()
)
由于之前 same-origin-policy 的类似问题(在生产中,管理站点从 CDN 域加载一些 URL,这可以触发它)我们有一个 "normaliser" JS 函数,它明确设置:
document.domain = "mysite.local";
在页面加载时 parent 和弹出窗口中。
弹出窗口包含一个 link 和一个触发 parent 中的 JS 函数的 onclick 处理程序:
onclick="opener.dismissRelatedLookupPopup(window, '422'); return false;"
在 Chrome 或 FF 中单击此 link 会导致类似的浏览器错误:
Permission denied to access property "dismissRelatedLookupPopup" on
cross-origin object
或
Blocked a frame with origin "http://mysite.local" from accessing a
cross-origin frame.
弹出窗口和打开器 URL 共享相同的协议、域和端口。
这只是本地域的问题。在dev/uat/production站点(即dev.mysite.com),所有站点都通过上述"normaliser"函数将域设置为超级域"mysite.com",弹出窗口可以成功调用JS函数在 parent.
是什么阻止了本地域?我错过了什么?
按照@charlietfl 最初的建议,切换本地域似乎确实解决了这个问题。它现在以 local.mysite.com
而不是 mysite.local
在本地运行,并且同源错误已经消失。我仍然不清楚是什么触发了错误(是因为该域只有两个部分而不是三个部分吗?它是否特定于以“.local”结尾的域?)但万一其他人绊倒了在此基础上,这就是为我解决的问题。
我在 http://mysite.local/ 上有一个本地开发站点 运行 (这是一个安装了 Grappelli 的 Django 管理站点,如果有任何相关性的话)。
管理站点为某些操作打开弹出窗口 window(即通过 showRelatedObjectLookupPopup()
)
由于之前 same-origin-policy 的类似问题(在生产中,管理站点从 CDN 域加载一些 URL,这可以触发它)我们有一个 "normaliser" JS 函数,它明确设置:
document.domain = "mysite.local";
在页面加载时 parent 和弹出窗口中。
弹出窗口包含一个 link 和一个触发 parent 中的 JS 函数的 onclick 处理程序:
onclick="opener.dismissRelatedLookupPopup(window, '422'); return false;"
在 Chrome 或 FF 中单击此 link 会导致类似的浏览器错误:
Permission denied to access property "dismissRelatedLookupPopup" on cross-origin object
或
Blocked a frame with origin "http://mysite.local" from accessing a cross-origin frame.
弹出窗口和打开器 URL 共享相同的协议、域和端口。
这只是本地域的问题。在dev/uat/production站点(即dev.mysite.com),所有站点都通过上述"normaliser"函数将域设置为超级域"mysite.com",弹出窗口可以成功调用JS函数在 parent.
是什么阻止了本地域?我错过了什么?
按照@charlietfl 最初的建议,切换本地域似乎确实解决了这个问题。它现在以 local.mysite.com
而不是 mysite.local
在本地运行,并且同源错误已经消失。我仍然不清楚是什么触发了错误(是因为该域只有两个部分而不是三个部分吗?它是否特定于以“.local”结尾的域?)但万一其他人绊倒了在此基础上,这就是为我解决的问题。