在Elastic Beanstalk上使用Node / Express重定向到HTTPS

时间:2016-10-04 04:18:31

标签: javascript node.js express https elastic-beanstalk

我试图让网站强制使用HTTPS(从HTTP重定向)。我们已通过AWS Elastic Beanstalk设置了HTTPS。问题是,目前可以使用HTTP和HTTPS。

阅读了几篇帖子,包括this one后,下面的代码就是我提出的。不幸的是,这不起作用。

我错过了什么?

import express from 'express';
import { join } from 'path';

const app = express();
const buildPath = join(`${__dirname}/../build`);
const enforceHTTPS = (req, res, next) => {
  if (req.headers['x-forwarded-proto'] === 'https') return next();
  else return res.redirect(301, join(`https://${req.hostname}${req.url}`));
};

app.use(express.static(buildPath));
app.use(enforceHTTPS);
app.get('*', (req, res) => res.sendFile(`${buildPath}/index.html`));
app.listen(process.env.PORT || 3000, () => console.log('Server running on port 3000!'));

export default app;

3 个答案:

答案 0 :(得分:1)

事实证明,我只需要重新排序我的app.use语句 - 在提供静态文件之前调用重定向

此外,为了使其能够在IE / Edge上运行,需要将“https://”移动到path.join之外(join会删除第二个正斜杠,尽管所有其他主流浏览器都会正确处理它, IE不喜欢它。)

这是一个有效的例子:

import express from 'express';
import { join } from 'path';

const app = express();
const buildPath = join(`${__dirname}/../build`);
const enforceHTTPS = (req, res, next) => {
  if (req.headers['x-forwarded-proto'] === 'https') return next();
  return res.redirect(301, `https://${join(req.hostname, req.url)}`);
};

app.use(enforceHTTPS);
app.use(express.static(buildPath));
app.get('*', (req, res) => res.sendFile(`${buildPath}/index.html`));
app.listen(process.env.PORT || 3000, () => console.log('Server running on port 3000!'));

export default app;

答案 1 :(得分:0)

您的代码中最明显的问题是HTTPS是从端口443提供的。此外,它看起来像过时的代码。为什么不使用最新版本的Express?如果你看一下HTTPS的例子,他们在这里给出的内容与你所写的完全不同:http://expressjs.com/en/api.html搜索' HTTPS'

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

http.createServer(app).listen(80);
https.createServer(options, app).listen(443);

答案 2 :(得分:0)

当我过去使用node.js作为代理时,我们获得不安全的代理连接到安全的方式如下,修改以匹配您的代码:

const httpsPort = process.env.HTTPS_PORT;

app.use(function(req, res, next) {
    if (req.secure) {
        return next();
    }
    res.redirect(301, ['https://', req.hostname, ':', httpsPort, '/', req.url].join('');
}

其中httpsPort是您的标准https连接将通过的端口。其中process.env.HTTPS_PORT将获取https端口的环境变量(标准为443)。您可以将其替换为您想要获取端口的任何内容。