我有一个位于普通网站子域的网站测试版,例如:
http://test.x.com而不是 http://x.com.
http://test.x.com而不是 http://x.com.
我使用< base> tag将所有资源请求转换回原始域:
<base href="http://x.com/" />
在我实现HTML5 push / replaceState支持之前,这种策略很有效.
现在,如果我在控制台中执行此语句:
history.pushState({},"","");
…然后我在基于WebKit的浏览器中获得一个DOMException对象:
code: 18 constructor: DOMExceptionConstructor line: 2 message: "SECURITY_ERR: DOM Exception 18" name: "SECURITY_ERR" sourceId: 4839191928 __proto__: DOMExceptionPrototype
…和FireFox 4中的此错误:
Security error" code: "1000
如果我删除< base>标记并执行相同的语句,推送新状态,并且没有异常.
几个问题:1)这种行为是安全风险,还是一个bug?并且2)是否存在防止异常的@R_403_323@,或者除了使用< base>之外的策略.将完全回避问题的标签?
谢谢你的考虑.
@R_403_323@
这不是一个错误,你违反了
Same origin policy.“”是一个相对的URL,它将被解析为’http://x.com/’,因为你使用了< base>标签.
http://x.com是一个与托管页面不同的域,这就是为什么这样做会违反相同的原始策略.
在history.pushState()调用中使用指向http://test.x.com/上的资源的绝对URL应解决此问题:
history.pushState({},"http://test.x.com/");