HTML5 push / replaceState и тег <base>вызывают исключение безопасности - PullRequest
8 голосов
/ 15 июня 2011

У меня есть тестовая версия сайта, расположенная в поддомене обычного сайта, например: http://test.x.com вместо http://x.com.

Я использую тег <base> для перевода всех запросов ресурсов обратно в исходный домен:

<base href="http://x.com/" />

Эта тактика прекрасно работала, пока я не реализовал поддержку push / replaceState в HTML5.

Теперь, если я выполню этот оператор в консоли:

history.pushState({}, "", "");

... тогда я получаю DOMException объект в браузерах на основе WebKit:

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) это поведение представляет собой угрозу безопасности или это ошибка? И 2) есть ли обходной путь, чтобы предотвратить исключение, или тактика, отличная от использования тега <base>, которая полностью обойдет проблему?

Спасибо за внимание.

1 Ответ

13 голосов
/ 15 июня 2011

Это не ошибка, вы нарушаете политику Одинакового происхождения ."" - это относительный URL, который будет преобразован в 'http://x.com/', так как вы использовали тег <base>.http://x.com - это домен, отличный от того, где размещена страница, поэтому выполнение этой процедуры противоречит той же политике происхождения.

Использование абсолютного URL-адреса, указывающего на ресурс в http://test.x.com/ в вашем history.pushState() звонке должно это исправить:

history.pushState({}, "", "http://test.x.com/");
...