5 votes

Vhost filtre ip express nœud

Je suis en train d'utiliser vhost avec express pour gérer deux sous-domaines. Tout fonctionne bien mais j'aimerais filtrer les requêtes pour l'un des sous-domaines par IP. Savez-vous si c'est possible de le faire ?

J'ai essayé de le gérer dans le app.js de mon site de sous-domaine mais req.connection.remoteAddress et req.ip me donnent l'IP de mon serveur.

Quand j'avais seulement un sous-domaine et que je n'utilisais pas vhost, j'obtenais la bonne IP, mais depuis que j'utilise vhost, j'ai l'IP de mon serveur ...

Voici ma structure de dossier avant :

-- sous-domaine1/
    -- app.js
    -- views/

Voici ma nouvelle structure :

-- sous-domaine1/
    -- app.js
    -- views/
-- sous-domaine2/
    -- app.js
    -- views/
-- gestionSousDomaine/
    -- app.js

Voici mon code quand cela fonctionnait avant d'utiliser vhost et pour un seul sous-domaine :

sous-domaine1/app.js :

var express = require('express');
var path = require('path');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
require('body-parser-xml')(bodyParser);

var routes = require('./routes/index');

var app = express();

// Configuration du moteur de vue
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

// Décommentez après avoir placé votre favicon dans /public
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

// Middleware d'exemple pour obtenir l'IP
app.use(function (req, res) {
    console.log(req.ip); // cela me donne la bonne IP
});

app.use('/', routes);

module.exports = app;

Et le fichier qui gérait le serveur avant :

#!/usr/bin/env node

/**
 * Dépendances du module.
 */

var app = require('../app');
var debug = require('debug')('webservicePrestashop:server');
var https = require('https');
var fs = require('fs');

/**
 * Obtenez le port de l'environnement et enregistrez-le dans Express.
 */

var port = normalizePort(process.env.PORT || '443');
app.set('port', port);

/**
 * Créez un serveur HTTP.
 */

//var server = http.createServer(app);
var options = {
     key: fs.readFileSync('/chemin/vers/privkey.pem'),
     cert: fs.readFileSync('/chemin/vers/fullchain.pem'),
     ca: fs.readFileSync('/chemin/vers/chain.pem')
}
var server = https.createServer(options, app);

// Rediriger du port http 80 vers https
var http = require('http');
http.createServer(function (req, res) {
    res.writeHead(301, { "Location": "https://" + req.headers['host'] + req.url });
    res.end();
}).listen(80);

/**
 * Écoute sur le port fourni, sur toutes les interfaces réseau.
 */

server.listen(port);

/**
 * Gestionnaire d'événements pour l'événement "écoute" du serveur HTTP.
 */

function onListening() {
  var addr = server.address();
  var bind = typeof addr === 'string'
    ? 'pipe ' + addr
    : 'port ' + addr.port;
  debug('Écoute sur ' + bind);
}

Voici mon code pour gérer le sous-domaine :

gestionSousDomaine/app.js :

var express = require('express');
var vhost = require('vhost');
var http = require('http');
var https = require('https');
var fs = require('fs');
var tls = require('tls');

// Gestion des sites
const sousDomaine1 = {
    app: require('../sous-domaine1/app'),
    context: tls.createSecureContext({
        key: fs.readFileSync('chemin/vers/privkey.pem').toString(),
        cert: fs.readFileSync('chemin/vers/privkey.pem/fullchain.pem').toString(),
        ca: fs.readFileSync('chemin/vers/privkey.pem/chain.pem').toString()
    }).context
};
const sousDomaine2 = {
    app: require('../sous-domaine2/app'),
    context: tls.createSecureContext({
        key: fs.readFileSync('chemin/vers/privkey.pem/privkey.pem').toString(),
        cert: fs.readFileSync('chemin/vers/privkey.pem/fullchain.pem').toString(),
        ca: fs.readFileSync('chemin/vers/privkey.pem/chain.pem').toString()
    }).context
};
var sites = {
    "mon.sousdomaine1.com": sousDomaine1,
    "mon.sousdomaine2.com": sousDomaine2
};

var exp = express();
for (let s in sites) {
  exp.use(vhost(s, sites[s].app));
}

// Redirection du http vers https
http.createServer(function (req, res) {
    res.writeHead(301, { "Location": "https://" + req.headers['host'] + req.url });
    res.end();
}).listen(80);

var secureOpts = {
    SNICallback: function (domain, cb) {
        if (typeof sites[domain] === "undefined") {
            cb(new Error("domaine non trouvé"), null);
            console.log("Erreur : domaine non trouvé : " + domaine);
        } else {
            cb(null, sites[domain].context);
        }
    },
    key: fs.readFileSync('chemin/vers/privkey.pem/privkey.pem').toString(),
    cert: fs.readFileSync('chemin/vers/privkey.pem/fullchain.pem').toString()
};

// Création du serveur https
var httpsServer = https.createServer(secureOpts, exp);
httpsServer.listen(443);

Maintenant mon sous-domaine1/app.js est le même qu'avant

1voto

lifeisfoo Points 11

Avez-vous essayé avec la propriété req.ip ?

La documentation Express dit :

Contient l'adresse IP distante de la requête.

Lorsque le paramètre trust proxy n'évalue pas à false, la valeur de cette propriété est dérivée de l'entrée la plus à gauche dans l'en-tête X-Forwarded-For. Cet en-tête peut être défini par le client ou par le proxy.

Pour déboguer votre code, ajoutez un middleware de journalisation avant d'ajouter une application à l'objet express :

var exp = express();

// middleware de journalisation de l'adresse IP
app.use(function (req, res, next) {
    console.log(req.ip);
    next();
});

for (let s in sites) {
  exp.use(vhost(s, sites[s].app));
}

Ensuite, ajoutez le même middleware en tant que premier middleware de vos sous-applications. De cette façon, vous pouvez être sûr que le problème est causé par le module vhost.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X