当前位置: 首页 > 面试题库 >

Express.js重定向到HTTPS并发送index.html

虞承泽
2023-03-14
问题内容

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

最近,我在Heroku上设置了SSL,并希望确保所有来自HTTP的流量都重定向到HTTPS。我想建议的解决方案相结合,从这个帖子有什么我现在有,但在一个无限重定向循环结束了。

简而言之,我需要将所有流量从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);

问题答案:

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



 类似资料:
  • 隐私设置->清除浏览数据(从时间开始) https/ssl->管理证书->删除所有项(包括证书) 检查没有书签。 Firefox也有类似的问题,但它的解决方案不适用于Chrome。有人对我能做些什么有什么建议吗?提前感谢您的帮助!

  • 我正在使用Firefox,在设置服务器时,我一直在摆弄重定向。现在,Firefox已经缓存了从http://example.com/到https://example.com/和从http://sub.example.com/到https://sub.example.com/的301重定向。 我已经尝试了以下几件事: null 我的Firefox版本是38.0.1,我使用的是Windows8.1。我

  • 问题内容: __Apache 环境中心 尝试设置从http到https的自动重定向 我尝试将以下内容添加到我的httpd.conf中,但是没有用 有任何想法吗? 问题答案: 我实际上已经遵循了这个示例,并且对我有用:) 然后做:

  • 问题内容: 正在执行我的第一个Laravel 5项目,并且不确定在哪里或如何在我的应用程序上放置强制HTTPS的逻辑。关键在于,有许多域指向该应用程序,并且只有三分之二使用SSL(第三个是后备域,长话短说)。所以我想用我的应用程序的逻辑而不是.htaccess来处理这个问题。 在Laravel 4.2中,我使用以下代码完成了重定向: 我在想应该在中间件中实现类似这样的东西,但是我不能完全理解使用它

  • 我有以下htaccess代码: 我希望我的站点被重定向到使用HTTPS,并强制执行子域,但当我访问(没有HTTPS),它不会将我重定向到使用HTTPS。

  • 奇怪的问题。我使用FullCalendar向服务器上的endpoint发起ajax请求。终点是: 请注意,它是显式的HTTPS。但是,当我发起一个请求时(即当Fullcalendar发起一个请求时),我会得到一个301和一个到非HTTPSendpoint的重定向: 因为页面是通过HTTPS加载的,所以失败。 endpoint工作正常--当我将它加载到浏览器中时,我会得到预期的json输出(通过ht