ошибка document.domain

#javascript #same-origin-policy

#javascript #политика того же происхождения

Вопрос:

 Permission denied for <http://www.guy.lt> (document.domain=<http://www.guy.lt>) to get property Window.document from <http://www.guy.lt> (document.domain has not been set).
  

Если это не ошибка, то как объяснить такое поведение? (или, по крайней мере, сообщение об ошибке) И, конечно, как это исправить?

Другая странная вещь заключается в том, что в:

 debug.log('0');
document.domain = 'guy.lt';
debug.log('1');
document.domain = 'wwww.guy.lt';
debug.log('2');
  

debug.log('2') никогда не запускается. Однако в console нет ошибки. Скрипт просто перестает выполняться.

Комментарии:

1. @minitech: редактирование вопроса и последующий ответ на него не дают ответа на исходный вопрос. Сообщение об ошибке выглядит так, как отображается.

2. каков фактический домен страницы, на которой выполняется этот скрипт?

3. Я бы не был настолько нахальным, чтобы предполагать, что только потому, что вы не понимаете модель безопасности одного домена, это автоматически означает, что это ошибка. Вам действительно нужно указать ПОЛНЫЕ доменные имена обоих сайтов. Не только то, на что вы устанавливаете document.domain.

Ответ №1:

Я не могу сделать вывод, что вы делаете неправильно, основываясь на вашем вопросе, но чтобы включить междоменный скрипт, вы должны установить document.domain для одной и той же общей части домена. Также актуально:

  • Если одна сторона использует foo.guy.lt , а другая сторона использует bar.guy.lt , то вам придется устанавливать document.domain = "guy.ly" с обеих сторон.

  • Если вы установите document.domain значение guy.lt , то фактическим доменом должен быть guy.lt он сам или поддомен guy.lt . Вы не можете создавать (дополнительные) доменные имена.

  • Вы всегда должны явно указывать значение document.domain , даже если значением является сам фактический домен.

  • Вы никогда не сможете вернуться document.domain к более конкретному поддомену. Итак, если фактический домен является www.guy.lt , то вы можете изменить его document.domain на guy.lt . Однако после этого изменения вы не сможете изменить его обратно на www.guy.lt .

Примеры:

 // Actual domain is "www.foo.com"
document.domain = "foo.com"; // this is valid

// Actual domain is "bar.foo.com"
document.domain = "www.foo.com"; // this is invalid, "bar.foo.com" is not a subdomain of "www.foo.com"

// Actual domain is "blah.bar.foo.com"
document.domain = "bar.foo.com" // Ok
document.domain = "foo.com" // Still ok
document.domain = "bar.foo.com" // Invalid, you can't change it back to a more specific domain.
  

Комментарии:

1.Да, но в моем случае обе стороны используют document.domain www.guy.lt . Следовательно, этот комментарий не имеет значения.

2. То, что сказал Элиан, полностью соответствует действительности.

3. Честно говоря, я обновил свой ответ на основе ответа парней и обновленного вопроса 🙂

4. Это все еще не отвечает на мой вопрос, поскольку ошибка связана с попыткой подключиться с www.foo.com для www.foo.com где document.domain для обоих имеет одинаковое значение www.foo.com . Это может быть ошибка FF или что-то в этом роде, потому что я не получал такую же ошибку в Chrome. В любом случае, установка document.domain в foo.com на обоих концах исправлена проблема.

Ответ №2:

Междоменный доступ через document.domain разрешен только в том случае, если для обеих страниц явно установлено document.domain одинаковое значение. Это необходимая мера безопасности; в противном случае something.company.com можно было бы установить document.domain на company.com и читать что-либо из company.com . Как бы то ни было, это может быть сделано, только если company.com явно выбрано значение document.domain для company.com .