【问题标题】:Express.js redirect to HTTPS and send index.htmlExpress.js 重定向到 HTTPS 并发送 index.html
【发布时间】:2016-01-02 07:34:01
【问题描述】:

我有一个简单的 Express.js 实例,它为单页 Angular 应用程序提供静态资源。我在 Express 配置中设置了一些中间件,以便为所有路由返回 index.html,并且 Angular 可以从那里加载。

最近,我在 Heroku 上设置了 SSL,我想确保来自 HTTP 的所有流量都重定向到 HTTPS。我尝试将this post 建议的解决方案与我现在拥有的解决方案结合起来,但最终陷入了无休止的重定向循环。

简而言之,我需要将所有流量从 HTTP 重定向到 HTTPS,并为所有请求发送 index.html 文件。我在这里做错了什么?

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

// set environment variables
var env = app.get('env') || 'development';

app.use(morgan('dev'));

// serve static assets
app.use(gzippo.staticGzip("" + __dirname + "/dist"));
app.use("/js", express.static(__dirname + "/dist/scripts"));
app.use("/fonts", express.static(__dirname + "/fonts"));
app.use("/img", express.static(__dirname + "/dist/assets/images"));
app.use("/css", express.static(__dirname + "/dist/styles"));


// Redirect all HTTP traffic to HTTPS
function ensureSecure(req, res, next){
  if(req.secure){
    // OK, continue
    return next();
  };
  res.redirect('https://'+req.hostname+req.url); // handle port numbers if you need non defaults
};


// Always send index.html
function sendIndex(req, res, next) {
  res.sendfile('index.html', { root: __dirname + "/dist/"});
}


// Handle environments
if (env == 'production') {
  app.all('*', ensureSecure);
}

app.all('/*', sendIndex);

// Start server
app.listen(process.env.PORT || 5000);

【问题讨论】:

    标签: javascript angularjs node.js express heroku


    【解决方案1】:

    Heroku 在负载均衡器级别终止 SSL 连接,因此 req.secure 永远不会为真,因为您与 Heroku 负载均衡器的连接未使用 SSL,从而创建了无限重定向循环。

    您必须改为检查 X-Forwarded-Proto 标头:

    if(req.headers["x-forwarded-proto"] === "https"){
      // OK, continue
      return next();
    };
    res.redirect('https://'+req.hostname+req.url);
    

    编辑:您还可以设置app.enable("trust proxy") 以自动快速检查标题。见http://expressjs.com/guide/behind-proxies.html

    【讨论】:

    • 太棒了,这似乎对我有用。我在这里遇到的唯一另一个问题是它不会在根上应用重定向,只在其他路由上应用。我尝试将app.all 更改为app.use(ensureSecure);,但没有成功。有什么想法吗?
    • @WillHitchcock 是的,我打算建议使用 app.use 而不是 app.all,但如果这不起作用,则不确定是什么问题。尝试添加更多日志以跟踪在这种情况下发生的情况。
    • 我想我明白了。我只需要将重定向放在app.use(gzippo... 行之前。现在工作!
    • 非常适合我。非常感谢。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 2013-02-11
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多