如何设置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)
应该这样做