代码之家  ›  专栏  ›  技术社区  ›  ApplePie

如何使我的所有路由都具有https并强制http到https?

  •  3
  • ApplePie  · 技术社区  · 7 年前

    我不明白如何强制所有路由都使用https,并始终强制http到https。有人能告诉我应该如何更改下面的代码吗?我还是新手node.js节点. 任何帮助都将不胜感激。

    索引.js

    const express = require('express');
    const hbs = require('hbs');
    const path = require('path');
    var morgan = require('morgan')
    var session = require('express-session')
    const MongoStore = require('connect-mongo')(session);
    var passport = require('passport')
    var bodyParser = require('body-parser');
    var mongoose = require('mongoose');
    mongoose.Promise = global.Promise;
    mongoose.connect(process.env.MONGODB_URI || 'mongodb://localhost:27017/sth');
    
    const mainMiddleware = require('./middleware/main.js');
    const port = process.env.PORT || 3000;
    var app = express();
    app.use(morgan('dev'))
    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded({extended: true})); // for parsing application/x-www-form-urlencoded
    
    app.use(session({
        secret: 'alsjbfkajsbef09876', //salt
        resave: false, // always re-init cookie
        saveUninitialized: false, // always create session even if not log in
        store: new MongoStore({ mongooseConnection: mongoose.connection })
    }))
    app.use(passport.initialize());
    app.use(passport.session());
    
    app.use('/public', express.static(path.join(__dirname,'public')));
    
    app.set('view engine', 'hbs');
    
    app.use(mainMiddleware);
    
    app.get('/', function (req, res) {
        let loginStatus = req.isAuthenticated() ? "DASHBOARD" : ""
        let dashboard = req.isAuthenticated() ? "/client/current" : "/"
        res.render('frame.hbs', {content: 'homeContent', css: 'home.css', dashboard, loginStatus, script: ['online-tracking.js']})
    })
    
    //----include routes
    app.use('/api', require('./routes/api'));
    app.use('/', require('./routes/page'));
    app.use('/client', require('./routes/client-page'));
    app.use('/admin', require('./routes/admin-page'));
    
    
    //----connecting to port
    app.listen(port,()=>{
        console.log(`success connection to port ${port}`);
    })
    
    3 回复  |  直到 7 年前
        1
  •  1
  •   tremor    7 年前

    使用greenlock express(NPM上提供)这是非常简单的,而且它还可以从LetsEncrypt连接SSL证书。这是文档中的示例脚本。 https://git.coolaj86.com/coolaj86/greenlock-express.js

    'use strict';
    
    require('greenlock-express').create({
    
      // Let's Encrypt v2 is ACME draft 11
      version: 'draft-11'
    
      // Note: If at first you don't succeed, switch to staging to debug
      // https://acme-staging-v02.api.letsencrypt.org/directory
    , server: 'https://acme-v02.api.letsencrypt.org/directory'
    
      // Where the certs will be saved, MUST have write access
    , configDir: '~/.config/acme/'
    
      // You MUST change this to a valid email address
    , email: 'john.doe@example.com'
    
      // You MUST change these to valid domains
      // NOTE: all domains will validated and listed on the certificate
    , approveDomains: [ 'example.com', 'www.example.com' ]
    
      // You MUST NOT build clients that accept the ToS without asking the user
    , agreeTos: true
    
    , app: require('express')().use('/', function (req, res) {
        res.setHeader('Content-Type', 'text/html; charset=utf-8')
        res.end('Hello, World!\n\n💚 🔒.js');
      })
    
      // Join the community to get notified of important updates
    , communityMember: true
    
      // Contribute telemetry data to the project
    , telemetry: true
    
    //, debug: true
    
    }).listen(80, 443);
    

    在找到这个之前,我将实际使用Apache作为节点的前端代理。如果您希望将站点绑定到端口:443英寸虚拟主机环境。

    我真正喜欢绿洛克的是你端口:80和端口:443英寸init脚本,它还为您处理重定向。

        2
  •  0
  •   Zarazas    7 年前

    如果你想用https加密你的连接,你需要一个SSL证书来验证,你是一个真正的人,你的内容的保证。大多数托管服务,如微软Azure和Amazon Web服务,都提供了创建SSL证书的可能性

        3
  •  0
  •   Sushant Magoo    7 年前

    var http = require('http');
    var https = require('https');
    app.set('port', port);
    app.set('secPort', port + 443);
    var server = http.createServer(app);
    server.listen(port);
    server.on('error', onError);
    server.on('listening', onListening);
    var options = {
        key: fs.readFileSync('/private.key'),
        cert: fs.readFileSync('/certificate.pem')
     };
    var secureServer = https.createServer(options, app);
    secureServer.listen(app.get('secPort'), () => {
        console.log('server listening on port', app.get('secPort'));
    });
    secureServer.on('error', onError);
    secureServer.on('listening', onListening);
    app.all('*', (req, res, next) => {
        if (req.secure) {
            return next();
        } else {
            res.redirect(307, 'https://' + req.hostname + ':' + app.get('secPort') + req.url);
        }
    });
    推荐文章