如何设置socket.IO起源限制连接到一个url
how to set socket.io origins to restrict connections to one url
我们有一个html网站和一个为该网站服务的node.js服务器。网站和服务器使用socket .io交换数据。我们在文档中找到了这个:
origins默认为 *:*
允许连接到套接字的源。IO服务器。
我们的html。网站在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接收来自客户端的origin(或referer),检索域名和端口,并与您指定的origins
选项比较。
所以有效的origins
值是(*
表示"任何"):
-
testsite.com:80
-
http://testsite.com:80
-
http://*:8080
-
*:8080
-
testsite.com:* http://someotherdomain.com:8080
(多个原点以空格分隔) -
testsite.com:*/somepath
(socket。 -
*:*
这些都是无效的(因为没有端口号):
-
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在开发模式下运行,所以它根本无法工作。启用生产模式后,一切正常。
我知道这个答案有点晚了但是也许其他人会用
对于较新版本的socket.io
(到当前4.x.x
),您需要将CORS origin设置为服务器选项的一部分。
CORS现在被分离到自己的模块中-详细信息请参阅自述文件
默认配置为;
{
"origin": "*",
"methods": "GET,HEAD,PUT,PATCH,POST,DELETE",
"preflightContinue": false,
"optionsSuccessStatus": 204
}
和限制一个站点使用任何子域;
cors: {
origin: [/'.example'.com$/],
methods: ["GET", "POST"]
}
这里是一个非常简单/基本的配置块,为那些没有使用express或任何其他原始套接字的人。io引擎;编辑:socket.io
版本3更新。
// Options for socket.io => 3.0.0
var options = {
allowUpgrades: true,
transports: [ 'polling', 'websocket' ],
pingTimeout: 9000,
pingInterval: 3000,
cookie: 'mycookie',
httpCompression: true,
cors: '*:*' <---- Allow any origin here [NOTE THE NAME CHANGE]
};
旧版本使用;
// 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);
你可以在服务器端这样做你的网站url
if (origin !== 'https://foo.example.com') {
return callback('origin not allowed', false);
}
callback(null, true);
});
我认为io.set('origins', http://questionexample.com/page1)
应该这样做
- PHP 在 URL 字符串中连接变量
- 如何从Meteor内部获取当前连接的MongoDB数据库的URL
- 连接url中的变量
- Django Template+JavaScript:如何将Django模板url与JavaScript变量连接起来
- 如果没有连接,则停止url操作
- 有没有什么好的节点模块可以连接google shortener API来缩短长URL
- 用于 URL 设置的 PHP 连接.怎么做
- Angular js,如何在调用url之前检查用户是否有互联网连接
- 文件路径及其 URL 变量在连接时被缩短
- 在下划线.js模板中连接 @Url.内容 的字符串
- bxslider 和 url 之间的真正连接
- url重写与连接历史api回退
- 稳定的URL以确认连接JavaScript
- 如何将我们的android应用程序与url连接,并将数据传递到此url
- 从连接的套接字中查找命名空间或URL信息
- 如何提交带有连接URL的表单
- 使用javascript连接url的不同部分,并在最后一个数组变量的末尾添加分隔符
- 如何在有角度的模板中连接URL比在其他位置更不安全
- MongoHQ 节点.js连接 URL 连接失败
- 如何在Xcode上连接URL中的字符串(Objective-c)