我们有一个HTML网站,服务于某个网站的一个服务器的node.js。 该网站使用socke.io服务器交换数据。 我们发现这个文档中:
来源默认为 *:*
被允许连接到Socket.IO服务器的起源。
我们html.site是http://questionexample.com/page1
。 只有这个网站可以连接到我们的服务器。(但是每个人都可以连接到该网站。)我们如何必须设置的起源?
我们有一个HTML网站,服务于某个网站的一个服务器的node.js。 该网站使用socke.io服务器交换数据。 我们发现这个文档中:
来源默认为 *:*
被允许连接到Socket.IO服务器的起源。
我们html.site是http://questionexample.com/page1
。 只有这个网站可以连接到我们的服务器。(但是每个人都可以连接到该网站。)我们如何必须设置的起源?
如果你深入研究Socket.io源代码,你会发现这样的诗句:
var origin = request.headers.origin || request.headers.referer
, origins = this.get('origins');
...
var parts = url.parse(origin);
parts.port = parts.port || 80;
var ok =
~origins.indexOf(parts.hostname + ':' + parts.port) ||
~origins.indexOf(parts.hostname + ':*') ||
~origins.indexOf('*:' + parts.port);
正如你所看到Socket.io需要从客户端来了原点(或引用者),检索域名和端口,并与比较origins
你指定的选项。
因此,有效的origins
值( *
表示“任何”):
testsite.com:80
http://testsite.com:80
http://*:8080
*:8080
testsite.com:* http://someotherdomain.com:8080
(多个起点由空格分隔) testsite.com:*/somepath
(socket.io将忽略/ somepath) *:*
这些都是无效的(因为没有端口号):
testsite.com
http://testsite.com
http://testsite.com/somepath
另外请注意,如果你指定sub.testsite.com
作为起始点的值时, testsite.com
将是有效的原产地。
我有类似的问题。 尝试在生产模式下运行节点NODE_ENV=production node app.js
。 我有这样的代码( 如建议在这里 ):
io.configure('production', function(){
console.log("Server in production mode");
io.enable('browser client minification'); // send minified client
io.enable('browser client etag'); // apply etag caching logic based on version number
io.enable('browser client gzip'); // the file
io.set('log level', 1); // logging
io.set('transports', [ // all transports (optional if you want flashsocket)
'websocket'
, 'flashsocket'
, 'htmlfile'
, 'xhr-polling'
, 'jsonp-polling'
]);
io.set('origins', 'http://questionexample.com/page1:*');
});
在发展模式节点落选所以它根本无法正常工作。 使生产模式后一切正常。
我知道这是有点晚了答案,但也许别人会使用
对于新版本的socket.io
(上升到目前的2.2.0
,你需要设置CORS起源的服务器选项的一部分。
这里是为那些谁过来找不使用明示或比原始socket.io发动机以外的任何一个非常简单/基本配置块;
// Options for socket.io > 1.0.0
var options = {
allowUpgrades: true,
transports: [ 'polling', 'websocket' ],
pingTimeout: 9000,
pingInterval: 3000,
cookie: 'mycookie',
httpCompression: true,
origins: '*:*' <---- Allow any origin here
};
io = require('socket.io')(8010, options);
如果你想限制原点,那么你应该使用origins: 'host-name:port-num'
的要求。
我认为io.set('origins', http://questionexample.com/page1)
应该这样做