【问题标题】:Socket.io access-control-allow=origin error from remote siteSocket.io access-control-allow=来自远程站点的来源错误
【发布时间】:2011-07-18 17:20:02
【问题描述】:

我正在尝试从另一个站点访问 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

【问题讨论】:

  • "资源被解释为脚本,但传输的 MIME 类型为 text/plain。"这也是个问题。
  • @JRPete 我面临着完全相同的问题,这让我发疯了!你能找到任何解决方案吗?
  • 请参考this 帖子,您可能会得到线索

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


【解决方案1】:

你configuresocket.io 是否仍然使用默认origins = * 或至少使用origins = site1.heroku.com

【讨论】:

    【解决方案2】:

    我面临的问题是,从不同的位置为客户端 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
    

    【讨论】:

    • 你也可以用 Nginx (michieldemey.be/blog/…) 代理它,这样你就可以在同一个域中拥有 nginx,而在其他地方拥有 socket.io。
    【解决方案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: '*:*'});
    

    感谢您的帮助:)

    【讨论】:

    • Vsplit,哪个版本的 socket.io 适合你?我目前遇到了这个问题。
    • 我使用的是 socket.io 0.9.0,即使在将来源设置为 : 之后,我也遇到了这个问题。 XMLHttpRequest 无法加载 undefined/socket.io/1/?t=1332151750943。 Access-Control-Allow-Origin 不允许来源localhost:8989。
    • @user644745 我面临着完全相同的问题,这让我发疯了!你能找到任何解决方案吗?
    • @Bitsian 你找到解决方案了吗?在这里仍然面临同样的问题。
    • @Mahn 已经发布了我的答案!很久以前了,但我已经在我的 socket.io 文件中发布了我的设置,它肯定对我有用!!
    【解决方案4】:

    它可能并不完全相关,但最终可以在这个问题上帮助一些可怜的人:

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

    希望这可以帮助一些人。

    【讨论】:

    • 对我来说同样的问题。我试图使用socket.io 连接到服务器,并且它仅在我将文件放在服务器而不是磁盘上时才有效。但是我真的很想把它作为本地文件加载到 Chrome 中,还有其他解决方案吗?
    • 帖子早已死去,但为了将来参考,您可以使用 WAMP Stack 安装或类似的东西将其托管在 localhost 或类似的地方,而不是加载文件。
    【解决方案5】:

    这对我有用

    var app = require('express')()
      , server = require('http').createServer(app)
      , sio = require('socket.io');     
    
    var io = sio.listen(server, { origins: '*:*' });
    

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

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

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

        此问题存在一个未解决的错误,您可以阅读更多相关信息here:

        【讨论】:

          【解决方案8】:

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

          我变了

          var socket = io('localhost');
          

          到

          var socket = io();
          

          【讨论】:

            猜你喜欢
            • 2013-05-09
            • 2013-01-20
            • 2012-08-10
            • 2016-02-14
            • 2013-02-05
            • 2011-10-27
            相关资源
            最近更新 更多