Socket.io访问控制允许=来自远程站点的原始错误
我正尝试从另一个站点访问一个socket.io服务器。 它工作了几个星期,但现在我不断收到以下错误。 从heroku服务器访问节点上的服务器时会发生这种情况。 错误是:
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
你configuration了 socket.io仍然使用默认的origins = *
或至less把origins = site1.heroku.com
我面临的问题是,从不同的位置服务于客户端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
我有同样的问题,我不能解决。
我testing了很多configuration:
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: '*:*'});
感谢你的帮助:)
这可能不完全相关,但最终可能会帮助一些可怜的灵魂在这个问题上:
我刚刚遇到了从本地磁盘运行客户端(至less在Windows上),例如。 file:///c:/...
产生一个“空”的原点,这会使原点检查崩溃。 尝试上传客户端到远程网站,并从那里开火。 离开起点: 。
希望这可以帮助一些人。
这对我有效
var app = require('express')() , server = require('http').createServer(app) , sio = require('socket.io'); var io = sio.listen(server, { origins: '*:*' });
我通过从服务器本身加载客户端的socket.io.js解决了这个问题,而不是在网站上维护一个本地副本。 在我的设置中,某个网站上有一个网页,它从位于不同位置的服务器获取文件。
一个简单的解决方法(感谢mattcodez ):
io = io.listen(8888); io.server.removeListener('request', io.server.listeners('request')[0]);
这个问题有一个开放的错误,你可以在这里阅读更多关于它的信息 :
我通过更改一行客户端代码来解决这个问题。
我变了
var socket = io('localhost');
至
var socket = io();