Nodejs res.redirect不工作?

时间:2017-11-29 15:43:03

标签: angularjs node.js redirect

我有我的Angularjs网站,我正在尝试将所有Http流量路由到Https,为此,我写了下面的代码,但每次打开我的网站时它都无效Http重定向未发生。

var express = require('express');
var app = express();

app.use(express.static(__dirname + '/public')); // Website part added
var bodyParser = require('body-parser')
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }))

app.use(function(req,res,next) {

    if(req.headers["x-forwarded-proto"] == "http") {

        res.redirect("https://" + req.headers.host + req.url);
        return next();
    } else {
        console.log('Request was not HTTP');
        return next();
    } 
});

app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

app.get('*', function(req, res) {
    res.sendFile(__dirname + '/public/index.html');
});

任何人都可以告诉我为什么这不起作用?

修改 - 我注意到每当我打开我的网站时,most of the times这个中间件都是not getting called。怎么可能呢?

修改 - 我的base href="/"中设置了index.html,这会导致任何问题。

2 个答案:

答案 0 :(得分:1)

你好我实际上犯的错误是我在设置redirecting目录后将/public放在中间件上,但正确的方法是在设置/public目录之前放置它。

正确代码

app.use(function(req,res,next) {

    if(req.headers["x-forwarded-proto"] == "http") {

        res.redirect("https://" + req.headers.host + req.url);
        return next();
    } else {
        console.log('Request was not HTTP');
        return next();
    }
});
app.use(express.static(__dirname + '/public')); // Website part added
var bodyParser = require('body-parser')
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }))

由于Https没有执行,但现在一切都按预期工作。

答案 1 :(得分:0)

这是因为在所有情况下都不能依赖x-forwarded-proto标头。

x-forwarded-proto通常是在代理后面运行您的应用时设置的,显然不是您的情况。

最好使用req.protocol代替:

if (req.protocol === "http") {
  res.redirect("https://" + req.headers.host + req.url);
} else {
  console.log('Request was not HTTP');
  return next();
}

或者您可以使用方便的 Express 请求属性req.secure