【发布时间】:2019-03-27 16:48:49
【问题描述】:
我有一个在 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 分配给该域。我知道这不应该是让它发挥作用的方法。
解决办法是什么?
【问题讨论】:
-
从广义上讲,解决方案不是向不安全的
http:或ws:websocket 服务发出请求(而是必须连接到https:或wss:服务)。如何让现有服务使用https:/wss:(或寻找新服务)取决于您连接的服务的细节(或您选择新服务的标准)需要)。另一种解决方案是使您的顶级页面不安全,并停止通过 HTTPS 提供当前页面。
标签: javascript node.js websocket socket.io reverse-proxy