我有一个在https上运行的网站,作为新功能的一部分,我创建了一个基于nodejs + socket.io的对话服务器。
我决定在单独的AWS实例上托管会话服务器。 当我尝试从我的主要网站(在https上运行)到对话服务器(在http://123.123.45.56之类的AWS静态IP实例上运行)建立套接字连接时,它无法正确建立套接字连接,并且浏览器显示以下错误记录到控制台:
Mixed Content: The page at 'https://www.mydomain' was loaded over HTTPS, but requested an insecure XMLHttpRequest endpoint 'http://123.123.45.56/socket.io/?payload=asdfkasdla'. This request has been blocked; the content must be served over HTTPS.
这是我制作连接节点服务器的方式:
io.connect(chatServerURL,{query: "payload=" + encryptedPayload,secure: false});
在会话服务器上,我使用路由/socket.io将来自端口80的所有流量路由到本地节点服务器端口和服务器,如下所示:
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/socket.io [NC]
RewriteCond %{QUERY_STRING} transport=websocket [NC]
RewriteRule /(.*) ws://localhost:3000/$1 [P,L]
ProxyPass / http://localhost:3000/
ProxyPassReverse / http://localhost:3000/
我应该怎么做才能使其正常工作? 我没有仅用于聊天服务器的域,然后将ssl分配给该域。我知道这不应该是使其工作的方法。
有什么解决方案?
答案 0 :(得分:0)
这可能会在将来帮助某个人采取正确的方法。 执行此操作的方法是将套接字连接发送到同一服务器,即在https上运行的服务器,然后在该服务器上使用反向代理将套接字请求代理到在http上运行的另一台计算机(运行node + socket.io服务器)。
在Apache服务器上,我需要启用模块proxy
和proxy_http
,并在apache虚拟主机配置中添加以下指令:
ProxyPass /socket.io/ http://123.45.56.67/socket.io
ProxyPassReverse /socket.io/ http://123.45.56.67/socket.io
在线上有很多资源,我只是没有意识到这个代理东西。 就是这样。