将Node.js Express静态请求重定向到HTTPS

4

我需要将所有的http请求都重定向到https,包括对静态文件的请求。

我的代码:

app.use(express.static(__dirname + '/public'));

app.get('*', function(req, res) {
    if (!req.secure){
            return res.redirect('https://' + config.domain + ":" + config.httpsPort + req.originalUrl);
        }
    res.sendFile(__dirname + '/public/index.html');    
});

静态文件上的重定向无法正常工作。如果我更改顺序:

app.get(...);

app.use(...);

那么我的静态文件无法正常工作。如何重定向这样的请求?
4个回答

5
var app = express();

app.all('*', function(req, res, next){
    console.log('req start: ',req.secure, req.hostname, req.url, app.get('port'));
    if (req.secure) {
        return next();
    }

    res.redirect('https://'+req.hostname + ':' + app.get('secPort') + req.url);
});

非常感谢。运行得很好。 - Astemir Almov

0

看一下 Node.js 模块 express-sslify。它正好可以做到这一点 - 重定向所有 HTTP 请求以使用 HTTPS。

你可以像这样使用它:

var express = require('express');
var enforce = require('express-sslify');

var app = express();

// put it as one of the first middlewares, before routes
app.use(enforce.HTTPS()); 

// handling your static files just like always
app.use(express.static(__dirname + '/public'));

// handling requests to root just like always
app.get('/', function(req, res) {
   res.send('hello world');
});

app.listen(3000);

文档:https://github.com/florianheinemann/express-sslify


我的服务器使用两个端口。第一个端口用于HTTP,第二个端口用于HTTPS。我需要手动重定向到带有HTTPS端口的URL。 - Astemir Almov

0
function forceHTTPS(req, res, next) {
    if (!req.secure) {


        var hostname = req.hostname;


        var destination = ['https://', hostname,':', app.get('httpsPort'), req.url].join('');

        return res.redirect(destination);
    }
    next();
}


//For redirecting to https
app.use(forceHTTPS);

// For serving static assets
app.use(express.static(__dirname + directoryToServe));

在提供静态资源之前,重定向到https。


0

这段代码可以轻松地重定向到 http / https 中的任意一个

res.writeHead(301, {
   Location: "http" + (req.socket.encrypted ? "s" : "") + "://" +    req.headers.host + loc,
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接