首页 > 解决方案 > 从 https 到节点服务器的套接字连接给出混合内容错误

问题描述

我有一个在 https 上运行的网站,作为新功能的一部分,我创建了一个基于 nodejs+socket.io 的对话服务器。

我决定在单独的 AWS 实例上托管对话服务器。当我尝试从我的主网站(在 https 上运行)到对话服务器(在 AWS 静态 IP 实例上运行,如http://123.123.45.56)建立套接字连接时,它没有正确建立套接字连接,浏览器显示以下错误记录到安慰:

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 分配给该域。我知道这不应该是让它发挥作用的方法。

解决办法是什么?

标签: javascriptnode.jswebsocketsocket.ioreverse-proxy

解决方案


这可能会帮助将来的人采取正确的方法。这样做的方法是将套接字连接发送到同一台服务器,即在 https 上运行的服务器,然后使用反向代理将套接字请求代理到在 http 上运行的不同机器(运行 node+socket.io 服务器)。

在 Apache 服务器上,我需要启用模块proxyproxy_http在 apache 虚拟主机配置中添加这些指令:

ProxyPass /socket.io/ http://123.45.56.67/socket.io
ProxyPassReverse /socket.io/ http://123.45.56.67/socket.io

网上有很多资源,我只是不知道这个代理的事情。这就是这样做的方法。


推荐阅读