origins - Socket.io+Node.js Solicitud de origen cruzado bloqueada
socket io send request (4)
Estoy usando node y socket.io para escribir una aplicación de chat. Funciona bien en Chrome, pero Mozilla da un error para habilitar las solicitudes de origen cruzado.
Solicitud de origen cruzado bloqueada: la misma política de origen no permite leer el recurso remoto en http://waleedahmad.kd.io:3000/socket.io/?EIO=2&transport=polling&t=1401964309289-2&sid=1OyDavRDf4WErI-VAAAI . Esto se puede solucionar moviendo el recurso al mismo dominio o habilitando CORS.
Aquí está mi código para iniciar el servidor de nodo.
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'');
});
En el lado del cliente.
var socket = io.connect(''//waleedahmad.kd.io:3000/'');
Etiqueta de script en la página HTML.
<script type="text/javascript" src="//waleedahmad.kd.io:3000/socket.io/socket.io.js"></script>
También estoy usando el archivo .htaccess en el directorio raíz de la aplicación. (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"
Arreglo simple del lado del servidor
var io = require(''socket.io'')(server, { origins: ''*:*''});
o
io.set(''origins'', ''*:*'');
o
io.origins(''*:*'') // for latest version
*
solo no funciona lo que me llevó por agujeros de conejo.
Después de leer muchos temas en StakOverflow y otros foros, encontré la solución de trabajo para mí. Esta solución es para trabajar sin Express .
Aquí están los requisitos previos.
- llame a su script js (src =) desde el mismo servidor al que se conectará el socket (no CDN o llamada local)
- asegúrese de tener la misma versión de socket.io en el lado del servidor y del cliente
- módulos de nodo necesarios: fs , path , socket.io y winston para el registro
- Instale Let''s encrypt certbot y genere un certificado para su dominio o compre un certificado SSL
- jQuery declarado antes de socket.io en el lado del cliente
- Codificación UTF-8
LADO DEL SERVIDOR
// 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
});
LADO DEL CLIENTE
<script src="https://my.domain.com:port/js/socket.io.js"></script>
<script>
$(document).ready(function() {
$.socket = io.connect(''https://my.domain.com:port'', {
secure: true // for SSL
});
//... your code here
});
</script>
Esto podría ser un problema de certificación con Firefox, no necesariamente algo malo con su CORS. La solicitud CORS de Firefox da ''Solicitud de origen cruzado bloqueada'' a pesar de los encabezados
Me encontré con el mismo problema con Socketio y Nodejs lanzando error CORS en Firefox. Tenía Certs para * .myNodeSite.com, pero me refería a la dirección IP de la LAN 192.168.1.10 para Nodejs. (La dirección IP de WAN también puede generar el mismo error). Dado que el Cert no coincide con la referencia de la dirección IP, Firefox lanzó ese error.
Puede intentar establecer la opción de origins
en el lado del servidor para permitir solicitudes de origen cruzado:
io.set(''origins'', ''http://yourdomain.com:80'');
Aquí http://yourdomain.com:80
es el origen desde el que desea permitir las solicitudes.
Puedes leer más sobre el formato de los origins
here