2016-10-04 91 views
4

我试图让网站强制使用HTTPS(从HTTP重定向)。我们已通过AWS Elastic Beanstalk设置HTTPS。问题是,目前,HTTP和HTTPS都可以使用。在Elastic Beanstalk上使用Node/Express重定向到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; 
+0

我想你可以代理所有HTTPS使用AWS请求HTTP在您的节点结束。保持节点在http上运行。否则,请按照建议与https一起使用https服务器。 – DrEarnest

回答

1

事实证明,我只是不得不对我的app.use语句重新排序 - 在之前调用服务于静态文件的重定向

此外,为了使其在IE/Edge上工作,需要将“https://”移动到path.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; 
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); 
+0

我不想在应用程序端使用Express设置HTTPS服务器 - 它已通过AWS Elastic Beanstalk进行设置。我正在尝试将HTTP流量重定向到HTTPS。 – jabacchetta

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)。你可以用你想要的端口替换它。

相关问题