如何设置socket.io起源限制连接到一个url

我们有一个html网站和一个node.js服务器,它服务于该网站。 网站和服务器使用socke.io交换数据。 我们在文档中find了这个:

原点默认为 *:* 允许连接到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 会忽略/ 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:*'); }); 

Node以交换模式运行,所以根本无法工作。 启用生产模式后,一切正常。

我知道这是一个有点晚的答案,但也许别人会使用它

我认为io.set('origins', http://questionexample.com/page1)应该这样做