Javascript History.js和同源策略遍历到SSL

Javascript History.js和同源策略遍历到SSL,javascript,ajax,mobile,same-origin-policy,browser-history,Javascript,Ajax,Mobile,Same Origin Policy,Browser History,我正在使用并尝试从HTTP站点推送状态更改,如: http://www.example.com/some/resource 。。。到我的安全站点(付款页面),如: https://www.example.com/payment/for/some/resource 。。。但我在Safari中遇到了一个错误: 安全错误:DOM异常18:试图突破 用户代理的安全策略 。。。尝试推动状态更改时,如: History.pushState(null, null, new_state_url); // new

我正在使用并尝试从HTTP站点推送状态更改,如:

http://www.example.com/some/resource

。。。到我的安全站点(付款页面),如:

https://www.example.com/payment/for/some/resource

。。。但我在Safari中遇到了一个错误:

安全错误:DOM异常18:试图突破 用户代理的安全策略

。。。尝试推动状态更改时,如:

History.pushState(null, null, new_state_url);
// new_state_url = https://www.example.com/payment/for/some/resource
我做了一些深入的研究,发现,这表明我正在运行的冲突,因为我试图推动跨协议的状态更改。这里建议的答案(如果我理解正确的话)是显式推送完整的URL,但我已经这样做了,并且得到了相同的错误

在上下文中,我正在构建我的站点的移动版本,并希望使用与我在所有其他页面加载中构建的相同的AJAX加载支付页面(我使用jQuery的
$.AJAX
和一些自定义动画构建了页面加载程序,大致类似于您在中可能找到的内容)


我是否可以跨SSL推送此状态更改?如果是这样,我该怎么做?

同一来源不仅包括协议和域,还包括元组协议、域和端口

在您的情况下,听起来好像您正在与协议(HTTP vs HTTPS)和端口(80和443)发生冲突

有一些标准方法可以解决SOP问题。一种方法是将两个域上的document.domain设置为相同的任意字符串:

document.domain = "foo.com";
另一个好方法是使用
GET
跨域加载JSONP


综上所述,这听起来不像是你想要做的事情。历史API允许您在同一个域上导航,而不必重新加载资源,同时仍保留资源。由于这是一个完全独立的域,我只需将
document.location
属性设置为新URL(您的安全登录页面),这将重新加载页面,但仍保留您的导航历史记录。

同一来源不仅包括协议和域,还包括元组协议、域和端口

在您的情况下,听起来好像您正在与协议(HTTP vs HTTPS)和端口(80和443)发生冲突

有一些标准方法可以解决SOP问题。一种方法是将两个域上的document.domain设置为相同的任意字符串:

document.domain = "foo.com";
另一个好方法是使用
GET
跨域加载JSONP


综上所述,这听起来不像是你想要做的事情。历史API允许您在同一个域上导航,而不必重新加载资源,同时仍保留资源。由于这是一个完全独立的域,我只需将
document.location
属性设置为新的URL(您的安全登录页面),这将重新加载页面,但仍保留您的导航历史记录。

此答案与问题无关,但是我在Safari中调用
window.history.replaceState
时经常遇到同样的错误。我在调用该函数时添加了速率限制,安全错误消失了。

这个答案与问题无关,但我在Safari中调用
window.history.replaceState时经常遇到相同的错误。我在调用该函数时添加了速率限制,安全错误消失了