2012-04-26 54 views
5

我試圖連接到一個server.domain.com的WebSocket跨域WebSocket連接在Firefox從trial.domain.com造成NS_ERROR_DOM_SECURITY_ERR

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++; 
} 
+0

您不應該使用user-agent嗅探來確定是否使用MozWebSocket,您應該查找WebSocket構造函數,並且只有在找不到它時才嘗試使用MozWebSocket構造函數。 – Neil 2012-04-26 23:22:12

回答

4

這種情況由正在申請使用,防止對外部域的任何訪問安全策略瀏覽器的頁面是自己託管的。
這發生在您嘗試從SSL區域獲取重要連接到非SSL和另一個域(不知道同一個域是否可以解決問題)的情況下 - 這是您的情況。但是有更多的可能的情況。

這是瀏覽器相關的錯誤,它是瀏覽器拋出這個錯誤,並沒有與它自己連接的問題。

您必須將您的WebSockets服務器託管在與http服務器相同的域下。如果這是不可能的,有幾個方法可以去:

  1. 如果軟件是用於室內和瀏覽器設置可用於做,那麼你可以禁用跨域安全策略:
    • Firefox,在「about:config」下設置「ecurity.fileuri.strict_origin _policy」爲「false」。
    • 鉻,與國旗運行「--allow-文件訪問從檔案」
  2. 如果你有機會到您的域的DNS設置,您可以創建子代理和它看起來像你連接到相同的域。在練習中不確定這個選項,但看起來不錯。
+0

WebSockets是爲支持跨域通信而開發的,因此我認爲問題的原因可能不是Web瀏覽器。我認爲服務器更可能以某種方式拒絕連接。請參閱[WebSocket RFC中的出處/安全注意事項](http://tools.ietf.org/html/rfc6455#section-10) – leggetter 2012-04-26 22:52:05

+3

請提供Firefox的版本。 以及我看到你從HTTPS區域到非SSL(ws://,但不是wss :: //)。這可能是一個問題。如果你使用SSL,那麼你應該使用WSS--它是WebSockets SSL。 – moka 2012-04-26 23:44:32

+0

切換到wss解決了安全問題。但我仍然無法連接到套接字。我認爲我的nginx conf是不正確的。 – 2012-04-30 09:29:14