Informations système
Servir l'application Web en utilisant SSL sur HTTPS sur l'hôte local Ce qui a été fait Informations supplémentaires L'application fonctionne actuellement lorsqu'il est initialisé à l'aide de J'ai passé beaucoup de temps à rechercher sur le Web comment appliquer cette solution, mais je n'ai pas encore trouvé de moyen pour que cela fonctionne. Toute aide est grandement apprécié.
server.js
server.js
dans les scripts package.json
. const express = require('express');
const next = require('next');
const dev = process.env.NODE_ENV !== 'production';
const app = next({ dev });
const handle = app.getRequestHandler();
const port = 3000;
const https = require('https');
const fs = require('fs');
const httpsOptions = {
key: fs.readFileSync('./certificates/key.pem'),
cert: fs.readFileSync('./certificates/cert.pem')
};
app
.prepare()
.then(() => {
const server = express();
server.get('*', (req, res) => {
return handle(req, res);
});
server.listen(port, err => {
if (err) throw err;
console.log('> Ready on http://localhost: ' + port);
});
})
.catch(ex => {
console.error(ex.stack);
process.exit(1);
});
yarn dev
. J'ai essayé de diffuser l'application sur https en utilisant cette réponse , mais je n'ai pas réussi à comprendre comment l'appliquer à configuration à l'aide de NextJS.
4 Réponses :
Il vous suffit d'utiliser la méthode createServer
du module https
.
const { createServer } = require('https'); const { parse } = require('url'); const { readFileSync } = require('fs'); const next = require('next'); const port = 3000; const dev = process.env.NODE_ENV !== 'production'; const app = next({ dev }); const handle = app.getRequestHandler(); const httpsOptions = { key: readFileSync('./certificates/key.pem'), cert: readFileSync('./certificates/cert.pem') }; app.prepare() .then(() => { createServer(httpsOptions, (req, res) => { const parsedUrl = parse(req.url, true); handle(req, res, parsedUrl); }).listen(port, err => { if (err) throw err; console.log(`> Ready on https://localhost:${port}`); }) });
Cela fonctionne pour moi, merci @ Tibi02! Auparavant, j'essayais d'utiliser la méthode createServer
mais je ne l'utilisais pas correctement, donc je suis heureux que vous ayez réussi à me donner un bon exemple.
Une autre réponse semblait simplement abandonner express ... J'ai trouvé une solution après quelques difficultés avec le code du serveur et le certificat, donc j'espère que cela peut sauver quelqu'un d'autre!
Tout d'abord, de solides conseils pour créer un certificat localhost ici: https://letsencrypt.org/docs/certificates-for-localhost/
Deuxièmement, un code simple qui offre HTTP / HTTPS avec js suivant et express:
const next = require('next'); const express = require('express'); const http = require('http'); const https = require('https'); const fs = require('fs'); const ports = { http: 3080, https: 3443 } const dev = process.env.NODE_ENV !== 'production'; const app = next({ dev }); const handle = app.getRequestHandler(); const server = express(); const options = { key: fs.readFileSync('localhost.key'), cert: fs.readFileSync('localhost.crt'), }; app.prepare().then(() => { server.all('*', (req, res) => { return handle(req, res) }); http.createServer(server).listen(ports.http); https.createServer(options, server).listen(ports.https); });
Il est intéressant de noter que l'on peut omettre ou rediriger l'un ou l'autre port.
Ci-dessous fonctionne très bien pour moi pour le prochain serveur avec https;
En utilisant cette documentation officielle du module node js https Création d'un serveur HTTPS
const { createServer } = require('http') const { parse } = require('url') const next = require('next') const { readFileSync } = require('fs'); const port = parseInt(process.env.PORT, 10) || 3000 const dev = process.env.NODE_ENV !== 'production' const app = next({ dev }) const handle = app.getRequestHandler() const httpsOptions = { pfx: readFileSync('./certificates/AMB.pfx'), passphrase: 'Testabc$' }; app.prepare().then(() => { createServer(httpsOptions, (req, res) => { const parsedUrl = parse(req.url, true) const { pathname, query } = parsedUrl if (pathname === '/login') { app.render(req, res, '/login', query) } else { handle(req, res, parsedUrl) } }).listen(port, err => { if (err) throw err console.log(`> Ready on https://localhost:${port}`) }) })
Notre implémentation simple et commutable:
const app = require('express')(); const https = require('https'); const http = require('http'); const next = require('next'); const fs = require('fs'); const path = require('path'); const HTTPS = true; const server = HTTPS ? https.createServer( { key: fs.readFileSync(path.resolve(__dirname, './server.key')), cert: fs.readFileSync(path.resolve(__dirname, './server.cert')), }, app ) : http.createServer({}, app); const port = parseInt(process.env.PORT, 10) || 3000; const dev = process.env.NODE_ENV !== 'production'; const nextApp = next({ dev }); const nextHandler = nextApp.getRequestHandler(); nextApp.prepare().then(() => { app.get('/api/something', (req, res) => { res.json({}); }); // ... app.get('*', (req, res) => { return nextHandler(req, res); }); server.listen(port, (err) => { if (err) throw err; console.log(`> Ready on http${HTTPS ? 's' : ''}://localhost:${port}`); }); });