如何让 socket.io 为子目录运行

Posted

技术标签:

【中文标题】如何让 socket.io 为子目录运行【英文标题】:How do I get socket.io running for a subdirectory 【发布时间】:2014-11-11 19:45:55 【问题描述】:

我有一个代理正在运行,它只访问我的 node.js 服务器以获取与 /mysubdir 相关的路径 如何为这种情况配置 socket.io?

在我尝试过的客户端代码中:

var socket = io.connect('http://www.example.com/mysubdir');

但后来我注意到底层的 socket.io(或 engine.io)http 请求正在命中

http://www.example.com/socket.io/?EIO=3&transport=polling&t=1410972713498-72`

我想让他们打

http://www.example.com/mysubdir/socket.io.....

我需要在客户端和服务器上配置什么吗?

【问题讨论】:

【参考方案1】:

在我的服务器上我不得不

var io = require('socket.io')(httpServer, path: '/mysubdir/socket.io')`

在我的客户中我不得不

<script src="http://www.example.com/mysubdir/socket.io/socket.io.js"></script>

还有

var socket = io.connect('http://www.example.com', path: "/mysubdir/socket.io");`

【讨论】:

var io = require('socket.io')(http, path: '/mysubdir/socket.io') - 为我工作 真的很酷,谢谢你的回答。注意,路径中的“/”似乎是强制性的。我试过 'mysubdir' 没有成功,用 '/mysubdir' 修改后成功了。【参考方案2】:

就我而言,我使用 nginx 作为反向代理。轮询时出现 404 错误。这就是我的解决方案。

节点服务器的url是https://example.com/subdir/

在 app.js 中我实例化了 io 服务器

var io = require('socket.io')(http, path: '/subdir/socket.io');

在我使用的html

socket = io.connect('https://example.com/subdir/', 
    path: "/subdir"
);

干杯, 卢克。

【讨论】:

我做到了,现在套接字请求 url 看起来不错。但我得到 No 'Access-Control-Allow-Origin' header is present on the requested resource error 我收到“Access-Control-Allow-Origin”错误 有没有人找到解决“请求的资源错误上没有'Access-Control-Allow-Origin'标头的问题”【参考方案3】:

使用 nginx,这是一个无需更改 socket.io 服务器应用程序中的任何内容的解决方案:

在 nginx 配置文件中:

location /mysubdir 
   rewrite ^/mysubdir/(.*) /socket.io/$1 break;
   proxy_set_header Upgrade $http_upgrade;
   proxy_set_header Connection "upgrade";
   proxy_http_version 1.1;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   proxy_set_header Host $host;
   proxy_pass http://127.0.1.1:3000;

在服务器中:

var io = require('socket.io')(3000)

在客户端:

var socket = io.connect('https://example.com/', 
    path: "/mysubdir"
)

【讨论】:

我在 kubernetes 中使用 nginx,也想这样做。你会碰巧知道如何在 kubernetes 的 Ingress yaml 定义中实现这种重写模式吗?问题:***.com/questions/69194402/… 对不起,没有,我还没有尝试在 kubernetes 中使用 nginx。【参考方案4】:

@Drew-LeSueur 的答案对于 socket.io >= 1.0 是正确的。

在使用 socket.io 0.9 时,我在文档中找到了the old way of doing it。

// in 0.9
var socket = io.connect('localhost:3000', 
  'resource': 'path/to/socket.io';
);

// in 1.0
var socket = io.connect('localhost:3000', 
  'path': '/path/to/socket.io';
);

注意/ 出现在新的path 选项中作为第一个字符。

【讨论】:

套接字请求 url 看起来不错。但我得到 No 'Access-Control-Allow-Origin' header is present on the requested resource error @DeepakDholiyan 您的错误似乎与 CORS 问题更相关。您的 javascript 与您的套接字是否托管在同一源上? 现在我收到 ERR_CERT_AUTHORITY_INVALID @DeepakDholiyan 假设您使用的是 socket.IO 0.9,我不确定您是否有详细的问题。也许在另一个堆栈溢出问题中详细说明您的代码和您的问题会更有帮助。 IMO,只告诉你得到的错误会让任何人都很难帮助你。 我的问题的链接:- ***.com/questions/52411188/…

以上是关于如何让 socket.io 为子目录运行的主要内容,如果未能解决你的问题,请参考以下文章

如何让我的音频在 socket.io 中播放?

如何将 Apache 配置为代理 socket.io 服务器

Socket.io 不适用于 https(让我们加密)

为 socket.io 和 SSL / WSS 配置 Apache

如何让用户加入他们的多个房间 socket.io

CORS、Laravel Valet 和 Socket.io