apache ssl(443)node.js ssl(8081)。客户端找不到socket.io.js

时间:2013-02-20 19:08:52

标签: apache node.js ssl amazon-web-services socket.io

我花了两天时间。希望有人有答案。

我有一个在端口443上运行SSL的apache服务器。 我有一个在端口8081上运行SSL的node.js服务器。

在客户端中,我试图包含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版本无效。有任何想法吗?在此先感谢!!

2 个答案:

答案 0 :(得分:0)

从你的评论中我猜你有一个CORS问题:

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

如果更改协议1,则原始策略后的原点不同。你必须包含一个标题。

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

关于不安全内容的警告是一个暗示导致问题的原因:您试图通过脚本访问原点,而脚本不是脚本的来源。这是一个安全问题,因为它可能会泄漏,从而允许将有害脚本注入页面

答案 1 :(得分:0)

不要将ProxyPass设置为Localhost!这不起作用!

在Apache配置中执行此操作:

<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 });

对我来说,这很好用!