J’utilise node et socket.io pour écrire une application de discussion. Cela fonctionne bien sous Chrome, mais mozilla génère une erreur pour activer les requêtes d’origine croisée.
Demande d’origine croisée bloquée: la règle d’origine identique interdit la lecture de la ressource distante à l’ adresse http://waleedahmad.kd.io:3000/socket.io/?EIO=2&transport=polling&t=1401964309289-2&sid=1OyDavRDf4WErI-VAAAI . Cela peut être corrigé en déplaçant la ressource dans le même domaine ou en activant CORS.
Voici mon code pour démarrer le serveur de noeud.
var express = require('express'), app = express(), server = require('http').createServer(app), io = require('socket.io').listen(server), path = require('path'); server.listen(3000); app.get('/', function(req, res) { res.sendfile(__dirname + '/public/index.html'); });
Du côté du client.
var socket = io.connect('//waleedahmad.kd.io:3000/');
Balise de script sur la page HTML.
J’utilise également le fichier .htaccess dans le répertoire racine de l’application. (waleedahmad.kd.io/node).
Header add Access-Control-Allow-Origin "*" Header add Access-Control-Allow-Headers "origin, x-requested-with, content-type" Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"
var io = require('socket.io')(server, { origins: '*:*'});
ou
io.set('origins', '*:*');
ou
io.origins('*:*') // for latest version
*
seul ne fonctionne pas, ce qui m’a fait descendre dans des trous de lapin.
Vous pouvez essayer de définir l’option d’ origins
côté serveur pour autoriser les requêtes d’origine croisée:
io.set('origins', 'http://yourdomain.com:80');
Ici http://yourdomain.com:80
est l’origine à partir de laquelle vous souhaitez autoriser les demandes.
Vous pouvez en savoir plus sur le format d’ origins
ici
Cela pourrait être un problème de certificateion avec Firefox, pas nécessairement quelque chose qui ne va pas avec votre CORS. Requête Firefox CORS donnant la “Requête d’origine croisée bloquée” malgré les en-têtes
Je rencontrais exactement le même problème avec Socketio et Nodejs en lançant une erreur CORS dans Firefox. J’avais Certs pour * .myNodeSite.com, mais je faisais référence à l’adresse IP du réseau local 192.168.1.10 pour Nodejs. (L’adresse IP WAN peut également générer la même erreur.) Le certificate ne correspondant pas à la référence de l’adresse IP, Firefox a renvoyé cette erreur.
Après avoir lu beaucoup de sujets sur StakOverflow et d’autres forums, j’ai trouvé la solution la plus adaptée à mes besoins. Cette solution est pour travailler sans Express .
voici les prérequirejs.
DU CÔTÉ SERVEUR
// DEPENDENCIES var fs = require('fs'), winston = require('winston'), path = require('path'); // LOGS const logger = winston.createLogger({ level : 'info', format : winston.format.json(), transports: [ new winston.transports.Console({ level: 'debug' }), new winston.transports.File({ filename: 'err.log', level: 'err' }), new winston.transports.File({ filename: 'combined.log' }) ] }); // CONSTANTS const Port = 9000, certsPath = '/etc/letsencrypt/live/my.domain.com/'; // STARTING HTTPS SERVER var server = require('https').createServer({ key: fs.readFileSync(certsPath + 'privkey.pem'), cert: fs.readFileSync(certsPath + 'cert.pem'), ca: fs.readFileSync(certsPath + 'chain.pem'), requestCert: false, rejectUnauthorized: false }, (req, res) => { var filePath = '.' + req.url; logger.info('FILE ASKED : ' + filePath); // Default page for visitor calling directly URL if (filePath == './') filePath = './index.html'; var extname = path.extname(filePath); var contentType = 'text/html'; switch (extname) { case '.js': contentType = 'text/javascript'; break; case '.css': contentType = 'text/css'; break; case '.json': contentType = 'application/json'; break; case '.png': contentType = 'image/png'; break; case '.jpg': contentType = 'image/jpg'; break; case '.wav': contentType = 'audio/wav'; break; } var headers = { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'OPTIONS, POST, GET', 'Access-Control-Max-Age': 2592000, // 30 days 'Content-Type': contentType }; fs.readFile(filePath, function(err, content) { if (err) { if(err.code == 'ENOENT'){ fs.readFile('./errpages/404.html', function(err, content) { res.writeHead(404, headers); res.end(content, 'utf-8'); }); } else { fs.readFile('./errpages/500.html', function(err, content) { res.writeHead(500, headers); res.end(content, 'utf-8'); }); } } else { res.writeHead(200, headers); res.end(content, 'utf-8'); } }); if (req.method === 'OPTIONS') { res.writeHead(204, headers); res.end(); } }).listen(port); //OPENING SOCKET var io = require('socket.io')(server).on('connection', function(s) { logger.info("SERVER > Socket opened from client"); //... your code here });
CÔTÉ CLIENT