Redirect from HTTP to HTTPS using node.js/Express
Yes, there is a way. First off, generate a self-signed certificate:
openssl req -nodes -new -x509 -keyout server.key -out server.cert
Then, serve over HTTPS thanks to Node's HTTPS lib:
// importsconst express = require('express');var fs = require('fs');const http = require('http');const https = require('https');const app = require('./path/to/your/express/app');// HTTPS serverconst httpsServer = https.createServer({ key: fs.readFileSync('server.key'), cert: fs.readFileSync('server.cert')}, app);httpsServer.listen(443, () => console.log(`HTTPS server listening: https://localhost`));
Finally, use a minimal HTTP server to listen requests to the same domain and redirects them:
// redirect HTTP serverconst httpApp = express();httpApp.all('*', (req, res) => res.redirect(300, 'https://localhost'));const httpServer = http.createServer(httpApp);httpServer.listen(80, () => console.log(`HTTP server listening: http://localhost`));
This is, of course, the minimal setup. For production, you'll use different certificates, and replace localhost
by a dynamic domain name that you'll generate from req
, and you might not want to use the ports 80 and 443, etc.
Related reads: