来自远程站点的Socket.io access-control-allow = origin错误

时间:2011-07-18 17:20:02

标签: node.js xmlhttprequest remote-access socket.io access-control

我正在尝试从其他站点访问socket.io服务器。它工作了几个星期,但现在我不断收到以下错误。从heroku上的服务器访问nodester上的服务器时会发生这种情况。错误是:

XMLHttpRequest cannot load http://site2.nodester.com/socket.io/xhr-polling//1311008802545. 
Origin http://site1.heroku.com is not allowed by Access-Control-Allow-Origin.
Resource interpreted as Script but transferred with MIME type text/plain.
Uncaught SyntaxError: Unexpected identifier

以下是我与套接字的连接方式:

socket = new io.Socket(
    'site2.nodester.com', {port: 80, rememberTransport: false}
);

这是服务器代码:

// requires

server = http.createServer(function(req, res){
    // server stuffs
}),

server.listen(8362);

var io = io.listen(server),

// io code

8 个答案:

答案 0 :(得分:5)

configure socket.io仍然使用默认origins = *或至少放origins = site1.heroku.com

答案 1 :(得分:4)

我遇到的问题是,从不同的位置为客户端socket.io.js提供服务。

您可以通过从尝试连接的同一服务器提供客户端js文件来避免此问题。

例如,我的初始客户端代码是这个,它抛出了错误

<script src="/socket.io/socket.io.js"></script>
var socket = io.connect('http://mydomain.com/');

一旦我将其修改为此,它就可以正常工作。

<script src="http://mydomain.com/socket.io/socket.io.js"></script>
var socket = io.connect('http://mydomain.com/');

我的服务器代码是,

var express = require('express');
var app = express();
app.use(function(req, res, next) {
        res.header("Access-Control-Allow-Origin", "*");
        res.header("Access-Control-Allow-Headers", "X-Requested-With");
        res.header("Access-Control-Allow-Headers", "Content-Type");
        res.header("Access-Control-Allow-Methods", "PUT, GET, POST, DELETE, OPTIONS");
        next();
    });
var server = http.createServer(app);
io = socketio.listen(server, {log:false, origins:'*:*'});
... //io.connect and events below

答案 2 :(得分:3)

我遇到了同样的问题而我没有得到解决。

我测试了很多配置:

  io.set("origins","*");
  io.set('transports', [
    'websocket'
  , 'flashsocket'
  , 'htmlfile'
  , 'xhr-polling'
  , 'jsonp-polling'
  ]);

  io.set("origins = *");
  io.set('transports', [
    'websocket'
  , 'flashsocket'
  , 'htmlfile'
  , 'xhr-polling'
  , 'jsonp-polling'
  ]);

var socket  = io.listen(appS1,{origins: '*:*'});

感谢你的帮助:)

答案 3 :(得分:3)

它可能并不完全相关,但最终可以帮助一些可怜的灵魂解决这个问题:

我刚刚遇到从本地磁盘运行客户端(至少在Windows上),例如。 file:///c:/...导致“null”原点,这将导致原点检查崩溃。尝试将客户端上传到远程网站并从那里开始。将原点保留在上。

希望这可以帮助一些人。

答案 4 :(得分:3)

这对我有用

var app = require('express')()
  , server = require('http').createServer(app)
  , sio = require('socket.io');     

var io = sio.listen(server, { origins: '*:*' });

答案 5 :(得分:0)

我通过从服务器本身加载客户端的socket.io.js解决了这个问题,而不是在站点上维护本地副本。在我的设置中,某个网站上有一个网页从服务器获取文件,该服务器位于不同的位置。

答案 6 :(得分:0)

一个简单的解决方法(感谢mattcodez):

io = io.listen(8888); io.server.removeListener('request', io.server.listeners('request')[0]);

此问题存在漏洞,您可以阅读更多相关信息here

答案 7 :(得分:0)

我通过更改一行客户端代码解决了这个问题。

我改变了

var socket = io('localhost');

var socket = io();