2011-12-19 105 views
2

我使用history.js并试图从一个HTTP站点推的状态变化,如:History.js和同源策略穿越到SSL

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

相同的来源不仅包括协议和结构域,但元组协议,域名和端口。

对你来说,这听起来像你触犯两个协议(HTTP VS HTTPS)和端口(80和443)的运行。

有几个标准的方法来解决SOP。一种方法是在两个域的document.domain的设置为相同的任意字符串:

document.domain = "foo.com"; 

另一个好办法就是跨使用GET域加载JSONP。

所有这一切说,这听起来并不像pushState是你在找什么做的。 History API允许您在同一个域上导航,而无需重新加载资源,同时仍然保留。由于这是一个完全独立的域,因此我只需将document.location属性设置为新的URL(您的安全签名页面),该URL将重新加载页面,但仍保留导航历史记录。

0

这个答案是不相关的问题,但我已经打电话window.history.replaceState时,往往得到了同样的错误在Safari。我添加了限速功能,并且安全错误消失了。