Nous avons un site html et un serveur node.js qui dessert ce site. Le site Web et le serveur échangent des données à l'aide de socke.io. Nous avons trouvé ceci dans la documentation:
origins est configuré par défaut sur *:*
Origines autorisées à se connecter au serveur Socket.IO.
Notre site html.site est sur http://questionexample.com/page1
. Seul ce site peut se connecter à notre serveur (mais tout le monde peut se connecter à ce site.) Comment définir les origines?
Si vous creusez dans le code source de Socket.io, vous trouverez ces lignes:
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);
Comme vous pouvez le voir, Socket.io prend Origin (ou le référant) provenant du client, récupère le nom de domaine et le port, Et se compare à l'option origins
que vous avez spécifiée.
Donc, les valeurs origins
valides sont (*
signifie "tout"):
testsite.com:80
http://testsite.com:80
http://*:8080
*:8080
testsite.com:* http://someotherdomain.com:8080
(plusieurs origines séparées par un espace) testsite.com:*/somepath
(socket.io ignorera/un chemin) *:*
Et ceux-ci ne sont pas valides (car pas de numéro de port):
testsite.com
http://testsite.com
http://testsite.com/somepath
Notez également que si vous spécifiez sub.testsite.com
en tant que valeur origins, le testsite.com
sera valide Origin.
J'ai eu le même problème. Essayez d’exécuter le noeud en mode de production NODE_ENV=production node app.js
. J'avais ce code ( comme recommandé ici ):
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:*');
});
et Node est en mode développement et ne peut donc pas fonctionner. Après avoir activé le mode de production, tout va bien.
Je sais que la réponse est un peu tardive, mais peut-être que quelqu'un d'autre l'utilisera
Pour les versions plus récentes de socket.io
(jusqu'au 2.2.0
actuel, vous devez définir CORS Origin dans les options du serveur.
Voici un bloc de configuration très simple/basique pour ceux qui cherchent sans utiliser express ou autre chose que le moteur socket.io brut;
// 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);
Si vous souhaitez restreindre l'origine, vous devez utiliser origins: 'Host-name:port-num'
selon vos besoins.