express 4.x 将 http 重定向到 https
Posted
技术标签:
【中文标题】express 4.x 将 http 重定向到 https【英文标题】:express 4.x redirect http to https 【发布时间】:2014-07-23 19:06:37 【问题描述】:我有以下代码:
var https = require('https');
var http = require('http');
var express = require('express');
var app = express();
var router = express.Router();
app.use('/', router);
//have 'server' listen for https
var server = https.createServer(config.sslCredential, app);
server.listen(config.serverPort);
//listen server on http, and always redirect to https
var httpServer = http.createServer(function(req,res)
res.redirect(config.serverDomain+req.url);
);
httpServer.listen(config.httpServerPort);
但不知何故,我无法将 https 请求重定向到 https 请求,我应该如何在 node.js 上使用 express 4.x 正确执行此操作?
【问题讨论】:
【参考方案1】:引用my own answer 的中间件解决方案(顺便说一句,在 express 3.0 上)
app.all('*', ensureSecure); // at top of routing calls
http.createServer(app).listen(80)
https.createServer(sslOptions, app).listen(443)
function ensureSecure(req, res, next)
if(req.secure)
// OK, continue
return next();
;
// handle port numbers if you need non defaults
// res.redirect('https://' + req.host + req.url); // express 3.x
res.redirect('https://' + req.hostname + req.url); // express 4.x
【讨论】:
对于任何使用 Heroku 的人来说,仅供参考,req.secure
将不起作用。在这里查看答案:***.com/questions/32952085/…
req.host
(express 3.x) 现在是 req.hostname
(express 4.x)
Elastic Beanstalk 或 ELB 后面的任何其他 EC2 实例也是如此,ELB 代表服务器终止 HTTPS。
截至 5/2017 w/ Express v 4.8.0:function ensureSecure(req, res, next) if(req.headers['x-forwarded-proto'] === 'https') // OK, continue return next() ; res.redirect('https://' + req.headers.host)
@PhilAndrews 使用 req.headers['x-forwarded-proto'] 的解决方案仅在快速服务器位于注入标头 x-forwarded-proto 的负载均衡器之后才有效以上是关于express 4.x 将 http 重定向到 https的主要内容,如果未能解决你的问题,请参考以下文章
使用 nodejs/express 登录后将用户重定向到 Angular 应用程序
将 Express.js 4 的 res.status(401) 链接到重定向