【问题标题】:document.domain bugdocument.domain 错误
【发布时间】:2011-08-20 11:13:02
【问题描述】:
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 中没有错误。脚本只是停止执行。

【问题讨论】:

  • @minitech:编辑问题然后回答,不回答原始问题。显示的错误消息。
  • 运行此脚本的页面的实际域是什么?
  • 我不会这么傲慢地假设仅仅因为您不了解同域安全模型,它就自动意味着它是一个错误。您确实需要列出两个站点的完整域名。不仅仅是您将 document.domain 设置为的内容。

标签: javascript same-origin-policy


【解决方案1】:

仅当 两个 页面明确将 document.domain 设置为相同值时,才允许通过 document.domain 进行跨域访问。这是必要的安全措施;否则something.company.com 可以将document.domain 设置为company.com 并从company.com 读取内容。事实上,只有当company.com 通过将document.domain 设置为company.com 来明确选择加入时,它才能做到这一点。

【讨论】:

    【解决方案2】:

    我无法根据您的问题推断您做错了什么,但要启用跨域脚本,您必须将 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.
    

    【讨论】:

    • 是的,但就我而言,双方都使用document.domainwww.guy.lt。因此,此评论无关紧要。
    • Elian 所说的完全相关。
    • 公平地说,我根据伙计们的回复和更新后的问题更新了我的答案:-)
    • 它仍然没有回答我的问题,因为错误是关于尝试从 www.foo.com 连接到 www.foo.com,其中两者上的 document.domain 都设置为相同的 www。 foo.com。这可能是 FF 错误或其他原因,因为我在 Chrome 中没有收到相同的错误。无论如何,在两端将 document.domain 设置为 foo.com 解决了这个问题。
    猜你喜欢
    • 1970-01-01
    • 2019-12-19
    • 2018-02-13
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 2016-10-20
    • 2012-12-25
    相关资源
    最近更新 更多