2013-02-20 67 views
1

我已經花了兩天時間了。希望有人有答案。apache ssl(443)node.js ssl(8081)。客戶找不到socket.io.js

我在端口443上運行 SSL我有端口8081

運行SSL在客戶端的node.js服務器Apache服務器,我想包括socket.io/socket.io .js文件如下:

<script src="https://my_url.com:8081/socket.io/socket.io.js"></script> 

我沒有得到404(未找到)。在Chrome的JavaScript控制檯中,我得到Status =(失敗)和Type = undefined。我已經嘗試了我找到的建議(使用src =「localhost ..」等,但它們也不起作用)。

它適用於我的http版本。我包括這樣的文件:

<script src="http://my_url.com:8080/socket.io/socket.io.js"></script> 

不知道爲什麼SSL版本不起作用。有任何想法嗎?提前致謝!!如果更改protocoll原產地是不遵循同源策略相同

http://en.wikipedia.org/wiki/Cross-origin_resource_sharing

+0

你能更詳細地系統的體系結構解釋,我不明白你爲什麼有兩個服務器上運行SSL和誰提供 – pfried 2013-02-20 19:14:51

+0

我使用Apache服務我的登錄等,然後在應用頁面包括PHP頁面腳本所有的腳本文件等。這就是我所說的socket.io.js。如果我沒有創建node.js ssl,那麼我會收到警告「......從http://my_url.com:8080/socket.io/socket.io.js提供不安全的內容」。 – Jen 2013-02-20 19:29:47

+0

我無法讓節點https服務器正常工作。但是找到了另一個解我正在使用Amazon Load Balancer來終止SSL並將http發送到節點服務器。它運作良好。我爲我的SSL Apache流量做同樣的事情。僅供參考 - 如果使用此路由,則需要在負載均衡器中使用TCP(SSL)和TCP選項來實現節點流量。 – Jen 2013-02-25 18:45:22

回答

0

從您的評論我猜你有CORS問題。你必須爲此包含一個標題。

https://developer.mozilla.org/en-US/docs/JavaScript/Same_origin_policy_for_JavaScript?redirectlocale=en-US&redirectslug=Same_origin_policy_for_JavaScript

約不安全內容的警告是一個提示是什麼原因導致的問題:您試圖訪問通過腳本起點,其是不是腳本的來源。這是一個安全問題,因爲它可能會提供泄漏,允許將有害腳本注入頁面

+0

瀏覽器對此的處理方式完全不同。一些加載腳本,但不執行它們一些發送一個OPTIONS請求到站點,並拒絕加載腳本 – pfried 2013-02-20 19:37:21

+0

我看着這個。但我不明白爲什麼我的http版本工作:。當我使用這個(當我的apache在端口80上運行,在node80上運行node.js時),它可以工作。 https有不同的來源策略規則嗎? – Jen 2013-02-20 19:45:53

+0

看起來我可能對我的node.js ssl安裝程序有問題。我只是嘗試直接在瀏覽器中訪問鏈接,併爲安全鏈接獲取SSL錯誤,但顯示的socket.io.js文件不安全。 – Jen 2013-02-20 19:57:56

0

請勿將ProxyPass設置爲Localhost!這不行!

在Apache configuraton這樣做:

<VirtualHost *:443> 
    ServerName domain.com 
    SSLProxyEngine On 
    RequestHeader set Front-End-Https "On" 
    ProxyPass/https://domain.com:3000/ retry=1 acquire=3000 timeout=600 Keepalive=On 
    ProxyPassReverse/https://domain.com:3000/ 

    SSLEngine on 
    SSLCertificateKeyFile /etc/ssl/private/domain.com.key 
    SSLCertificateFile  /etc/ssl/certs/domain.com.crt 
    SSLCertificateChainFile /etc/ssl/certs/chaincert.crt 
</VirtualHost> 

現在的NodeJS也可以有SSL:

var express = require('express'); 
var connect = require('connect'); 
var app = express(); 
var fs = require('fs'); 

var ssl_options = { 
    key: fs.readFileSync('/etc/ssl/private/domain.com.key'), 
    cert: fs.readFileSync('/etc/ssl/certs/domain.com.crt'), 
    ca: fs.readFileSync('/etc/ssl/certs/domain.com.ca') 
}; 

var server = require('https').createServer(ssl_options, app); 
var port = process.env.PORT || 3000; 

var io = require('socket.io')(server); 

server.listen(port, function(err) { 
    console.log(colors.green('https server running on port ' + port)); 
}); 

並在客戶端執行此操作:

var socket = io.connect('https://domain.com:3000', { path: '/socket.io', 'flash policy port': 3000 }); 

我,這工作正常!