我正在使用history.js并试图从HTTP网站推送状态更改,如:
http://www.example.com/some/resource
...到我的安全网站(付款页面),例如:
https://www.example.com/payment/for/some/resource
...但我在Safari中收到此错误:
SECURITY_ERR:DOM例外18:试图突破 用户代理的安全策略。
......当试图推动状态改变时:
History.pushState(null, null, new_state_url);
// new_state_url = https://www.example.com/payment/for/some/resource
进行一些挖掘,我发现this SO question,这表明我正在与Same Origin Policy发生冲突,因为我试图在协议中推动状态更改。那里建议的答案(如果我理解正确的话)是明确地推送完整的URL,但我已经这样做并得到同样的错误。
在上下文中,我正在构建我的网站的移动版本,并希望使用我围绕所有其他页面加载构建的相同AJAX来加载付款页面(我使用jQuery构建了我的页面加载器$.ajax
和一些自定义动画,大致类似于jQuery Mobile中的内容。
我是否可以跨SSL推送此状态更改?如果是这样,我该怎么做?
答案 0 :(得分:0)
同源不仅包括协议和域,还包括元组协议,域和端口。
在你的情况下,听起来你正在违反协议(HTTP与HTTPS)和端口(80和443)。
有几种标准方法可以解决SOP问题。一种方法是将两个域上的document.domain设置为相同的任意字符串:
document.domain = "foo.com";
另一个好方法是使用GET
在域中加载JSONP。
所有这些都说,听起来pushState
听起来并不像你想做的那样。历史记录API允许您在同一域上导航,而无需在保留的同时重新加载资源。由于这是一个完全独立的域名,我只需将document.location
属性设置为新的URL(您的安全登录页面),这将重新加载页面,但仍会保留您的导航历史记录。
答案 1 :(得分:0)
这个答案与这个问题无关,但我经常在调用window.history.replaceState
时在Safari中遇到同样的错误。我添加了速率限制,我调用该函数,安全错误就消失了。