跨域Websocket连接导致NS_ERROR_DOM_SECURITY_ERR错误

5

我正在尝试从trial.domain.com连接到server.domain.com上的websocket。

在Firefox中出现NS_ERROR_DOM_SECURITY_ERR错误:

"[Exception... "Security error" code: "1000" nsresult: "0x805303e8 (NS_ERROR_DOM_SECURITY_ERR)" location: "https://trial.domain.com/home Line: 454"]"

当我尝试建立WebSocket连接时:

try {
  if (window['MozWebSocket'] !== undefined) {
    socket = new MozWebSocket('ws://server.domain.com/chat');
  } else {
    socket = new WebSocket('ws://server.domain.com/chat');
  }
  trails = 0;
} catch(err){
  trials++;
}

你不应该使用用户代理嗅探来确定是否使用 MozWebSocket,而应该寻找 WebSocket 构造函数,仅当找不到时才尝试使用 MozWebSocket 构造函数。 - Neil
1个回答

4
这是由于浏览器应用了安全策略,防止访问自身所托管的外部域。在您尝试从SSL区域连接到非SSL和另一个域(不知道是否同一域将解决问题)时会出现这种情况 - 这是您的情况。但是,还有更多可能的情况。
这是与浏览器相关的错误,是浏览器抛出的错误,并且连接本身没有问题。
您必须将WebSockets服务器托管在与http服务器相同的域下。如果不可能,您可以采取以下几种方式:
1. 如果软件供内部使用,并且可以进行浏览器设置,则可以禁用跨域安全策略: - Firefox,在“about:config”下将“security.fileuri.strict_origin_policy”设置为“false”。 - Chrome,使用标志“--allow-file-access-from-files”运行。
2. 如果您可以访问您域名的DNS设置,则可以创建子转发器,看起来像您正在连接到同一域。关于实践中是否可行,不确定。

WebSockets是为了支持跨域通信而开发的,因此我认为问题的原因不太可能是Web浏览器。我认为更有可能的是服务器以某种方式拒绝了连接。请参阅WebSocket RFC中的Origin/安全考虑 - leggetter
3
请提供 Firefox 的版本号。从您的行为来看,您正在从 HTTPS 区域转移到非 SSL (ws://, 而不是 wss://)。这可能会导致问题。如果您正在使用 SSL,请使用 WSS - 它是 WebSockets SSL。 - moka
切换到 wss 解决了安全问题。但是我仍然无法连接到套接字。我认为我的 nginx 配置不正确。 - Sameer Segal
这里有一个关于Nginx配置的新问题:https://dev59.com/Wmkv5IYBdhLWcg3wvDXq - Sameer Segal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接