4
votes

HTTPS sur localhost en utilisant NextJS + Express

Informations système

Servir l'application Web en utilisant SSL sur HTTPS sur l'hôte local

Ce qui a été fait

  1. Création de l'application NextJS de base à l'aide de Créer l'application suivante
  2. Génération d'un certificat et d'une clé à l'aide d'OpenSSL et déplacement dans le répertoire du projet
  3. Ajout de la dépendance Express
  4. Configuration de l'application pour utiliser express dans server.js
  5. Script modifié pour utiliser le 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);
  });

Informations supplémentaires

L'application fonctionne actuellement lorsqu'il est initialisé à l'aide de 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.

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é.


0 commentaires

4 Réponses :


14
votes

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}`);
    })
  });


1 commentaires

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.



5
votes

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.


0 commentaires

0
votes

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}`)
    })
})


0 commentaires

0
votes

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}`);
  });
});


0 commentaires