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