Estoy usando el nodo y el zócalo.io para escribir una aplicación de chat. Funciona bien en Chrome, pero mozilla da un error de permitir la Cruz-las Solicitudes de Origen.

Cruz-Solicitud de Origen Bloqueado: El Origen Mismo de la Política no permite la lectura remota de los recursos en http://waleedahmad.kd.io:3000/socket.io/?EIO=2&transport=polling&t=1401964309289-2&sid=1OyDavRDf4WErI-VAAAI. Esto puede ser solucionado mediante el movimiento de los recursos para el mismo dominio o habilitar CORS.

Aquí está mi código para iniciar el nodo servidor.

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 secuencia de comandos en la página HTML.

<script type="text/javascript" src="//waleedahmad.kd.io:3000/socket.io/socket.io.js"></script>

También estoy usando .htaccess en el directorio raíz de la aplicación. (waleedahmad.kd.io/nodo).

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"
  • ¿Alguna vez conseguir este trabajo? Si es así, ¿cuál fue la solución?
InformationsquelleAutor Waleed Ahmad | 2014-06-05

8 Comentarios

  1. 66

    Simple En El Lado Del Servidor Revisión

    var io = require('socket.io')(server, { origins: '*:*'});

    o

    io.set('origins', '*:*');

    o

    io.origins('*:*') //for latest version

    * sola no funciona que me llevaron madrigueras.

    • Estoy usando la última versión y no lo es,, su darme error de connection refused
    • tal vez el trabajo a través de todos los primeros principios, a continuación, subir, por ejemplo, es mi firewall bloqueando el puerto? Puedo hacer ping a mi servidor, etc, etc.
    • La adición de una referencia stackoverflow.com/a/21711242/1591819
  2. 28

    Puede intentar establecer origins opción en el servidor para permitir la cruz-las solicitudes de origen:

    io.set('origins', 'http://yourdomain.com:80');

    Aquí http://yourdomain.com:80 es el origen que desea permitir solicitudes de.

    Usted puede leer más acerca de origins formato aquí

  3. 10

    Estoy usando v2.1.0 y ninguna de las respuestas anteriores trabajó para mí.
    Esto lo hizo:

    import express from "express";
    import http from "http";
    
    const app = express();
    const server = http.createServer(app);
    
    const sio = require("socket.io")(server, {
        handlePreflightRequest: (req, res) => {
            const headers = {
                "Access-Control-Allow-Headers": "Content-Type, Authorization",
                "Access-Control-Allow-Origin": req.headers.origin, //or the specific origin you want to give access to,
                "Access-Control-Allow-Credentials": true
            };
            res.writeHead(200, headers);
            res.end();
        }
    });
    
    sio.on("connection", () => {
        console.log("Connected!");
    });
    
    server.listen(3000);
    • Wow no puedo creer que esta es la única cosa que realmente funcionó para mí.
    • a mí me funciona, pero uno coma es la falta justo después de «req.los encabezados.origen,» Gracias !
    • Sí, tienes razón. Fijo. Por favor upvote la respuesta si funciona para usted.
    • Quiero entender por qué esto funciona a través de io.origen(«:«) no tiene sentido, que incluso trató de invalidar este el origen de los controladores de socket.io, señalando trabajado excepto esto.. estoy usando el zócalo.io 1.7.4 y el zócalo.io-cliente 2.2.0 con el socket.io-adaptador-mongodb 0.0.2
    • El amor que se puede decir, req.headers.origin aka whatevs hombre que acaba de trabajar.
    • No todos los héroes lleva un cabo! Gracias!

  4. 3

    Esto podría ser una certificación problema con Firefox, no necesariamente algo malo con su CORS. Firefox CORS solicitud dando ‘Cruz-Solicitud de Origen Bloqueado’ a pesar de los encabezados

    Yo estaba corriendo en exactamente el mismo problema con Socketio y Nodejs tirar CORS error en Firefox. Yo había Certs para *.myNodeSite.com pero yo estaba haciendo referencia a la dirección IP de la LAN 192.168.1.10 para Nodejs. (Dirección IP de la WAN podría tirar el mismo error así.) Desde el Cert no coincide con la dirección IP de referencia, Firefox tiró ese error.

  5. 3

    Después de leer un montón de subjetcs en StakOverflow y otros foros, he encontrado la solución de trabajo para mí. Esta solución es para trabajar sin Expresar.

    aquí son los requisitos previos.


    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>
  6. 1

    Bien he tenido algunos problemas para conseguir que esto funcione con un auto firmado cert para las pruebas, así que voy a copiar mi configuración que funcionó para mí. Si usted no está usando un auto firmado cert usted probablemente no tiene estos problemas, ojala!

    Para empezar dependiendo de tu navegador Firefox o Chrome se pueden tener diferentes problemas y voy a explicar en un minuto.

    Primera de la Instalación:

    Cliente

    //May need to load the client script from a Absolute Path
    <script src="https://www.YOURDOMAIN.com/node/node_modules/socket.io-client/dist/socket.io.js"></script>
    <script>
    var options = {
              rememberUpgrade:true,
              transports: ['websocket'],
              secure:true, 
              rejectUnauthorized: false
                  }
    var socket = io.connect('https://www.YOURDOMAIN.com:PORT', options);
    
    //Rest of your code here
    </script>

    Servidor

    var fs = require('fs');
    
    var options = {
      key: fs.readFileSync('/path/to/your/file.pem'),
      cert: fs.readFileSync('/path/to/your/file.crt'),
    
    };
    var origins = 'https://www.YOURDOMAIN.com:*';
    var app = require('https').createServer(options,function(req,res){
    
        //Set CORS headers
        res.setHeader('Access-Control-Allow-Origin', 'https://www.YOURDOMAIN.com:*');
        res.setHeader('Access-Control-Request-Method', '*');
        res.setHeader('Access-Control-Allow-Methods', 'OPTIONS, GET');
        res.setHeader('Access-Control-Allow-Headers', '*');
        if ( req.method === 'OPTIONS' || req.method === 'GET' ) {
            res.writeHead(200);
            res.end();
            return;
                }
    
    });
    
    var io = require('socket.io')(app);
    
    app.listen(PORT);

    Para el desarrollo de las opciones más utilizadas en el lado del cliente son aceptables en la producción desea la opción:

     rejectUnauthorized: false

    Usted más que probable que desee establecido en «true»

    Siguiente cosa es si es un auto firmado cert usted necesitará visitar a su servidor en una página separada/ficha y aceptar el cert o importarla en tu navegador.

    Para Firefox yo seguía recibiendo el error

    MOZILLA_PKIX_ERROR_SELF_SIGNED_CERT

    La solución para mí fue agregar las siguientes opciones y aceptar el cert en una página diferente/ficha.

    { 
    rejectUnauthorized: false
    } 

    En Chrome tuve que abrir otra página y aceptar el cert, pero después de que todo funcionaba bien sin la necesidad de añadir más opciones.

    Espero que esto ayude.

    Referencias:

    https://github.com/theturtle32/WebSocket-Node/issues/259

    https://github.com/socketio/engine.io-client#methods

  7. 0

    Si no funciona nada
    Ejecutar esto en la ventana ejecutar
    window+r

    chrome.exe –user-data-dir=»C:/Chrome dev sesión» –disable-web-seguridad

    mi problema se resuelve utilizando este método, la instalación de cors plugin funciona para php,node api de rest, pero en caso de socket.io cuando me habilitar cors socket dejado de funcionar.
    im que se ejecuta tanto en los diferentes puertos de

    localhost:3001 y ng en localhost:4200

    UPDATE– yo estoy usando el mecanismo nacional de prevención cors ahora el paquete y el trabajo como un encanto
    No hay problema con el socket.io demasiado.

    Agregar esta

    var express = require('express');
    var app = express();
    var http = require('http').Server(app);
    const cors = require('cors');
    var bodyParser   = require('body-parser');
    app.use(cors());
    app.options('*', cors());
    
    const auth = require('./routes/auth');
    
     const port = 3004;
    http.listen(port, () => {
      console.log( `running http at port ${port}`);
    });
    • esta no es una solución real, especialmente si cromo debe ser alterado :s
    • a continuación, utilice cors (paquete) para permitir el uso compartido de recursos de esto es lo que yo uso ahora

Dejar respuesta

Please enter your comment!
Please enter your name here