2011-12-19 108 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。我添加了限速功能,並且安全錯誤消失了。