我试图让网站强制使用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;
答案 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)。您可以将其替换为您想要获取端口的任何内容。