Socket.io 未设置 CORS 标头

Posted

技术标签:

【中文标题】Socket.io 未设置 CORS 标头【英文标题】:Socket.io doesn't set CORS header(s) 【发布时间】:2012-05-01 10:18:43 【问题描述】:

我知道这个问题已经被问过几次了。 但是,我无法让任何这些解决方案发挥作用。 我正在运行 node.js 和 socket.io 的标准安装。 (来自 Amazon EC2 上的 yum) 问题是 Chrome 正在回退到 xhr 轮询,并且这些请求需要有效的 CORS 配置。但是,我似乎无法让它工作。我的 Web 服务器在端口 80 上运行,node.js(socket.io) 在端口 81 上运行。如您所见,我试图让 socket.io 使用源策略。我也尝试过使用“* : *”作为来源,但没有运气。 这是我的代码:

var http = require('http');
var io = require('socket.io').listen(81, origins: '*');

io.configure( function()
    io.set('origin', '*');
);
io.set("origins","*");

var server = http.createServer(function(req, res) 
    io.sockets.emit("message", "test");
res.writeHead(200);
    res.end('Hello Http');
    console.log("Message recieved!");
);
server.listen(82);

io.sockets.on('connection', function(client)  
    console.log("New Connection");
);

非常感谢!

【问题讨论】:

【参考方案1】:

这是我让 CORS 与 socket.io 一起工作所必须使用的语法:

io.set( 'origins', '*domain.com*:*' );

如果出现这种情况,请使用console.log 确保您在Manager.prototype.handleHandshake 内的./lib/manager.js 中输入此代码块:

 if (origin) 
    // https://developer.mozilla.org/En/HTTP_Access_Control
    headers['Access-Control-Allow-Origin'] = '*';

    if (req.headers.cookie) 
      headers['Access-Control-Allow-Credentials'] = 'true';
    
  

【讨论】:

它没有工作......我目前正在考虑使用 sockjs 代替。不过还是谢谢啦! :D 但既然它对你有用,而且我认为我的安装和配置有误,我接受你的回答。 谢谢。如果您愿意,我仍然不介意与您一起调试。需要查看 HTTP 标头。 我多次查看 HTTP 标头,但 CORS 标头不存在。但我现在正在使用 sockjs,它就像一个魅力。非常感谢! 我建议将 '*domain.com*:*' 更改为 'domain.com:*' 以使其更安全。否则,您可以从“domain.com.example.com”、“anotherdomain.com”等域进行连接。

以上是关于Socket.io 未设置 CORS 标头的主要内容,如果未能解决你的问题,请参考以下文章

由于 CORS 错误,Socket.io 和 express 应用程序无法连接:“'Access-Control-Allow-Origin' 标头的值不能是通配符 '*'”

NestJs Socket io 适配器:如果使用 false 调用 allowFunction,服务器不会将 CORS 标头添加到握手的响应中。错误或配置错误?

未设置 CORS 标头

Socket.io Express Http-Server 后端,CORS 错误

Socket.io 1.0.6 的随机错误请求 400 错误

未设置 CORS 标头