仅通过https提供在cloudfoundry中托管的angularjs应用程序

时间:2018-02-27 18:13:31

标签: javascript angularjs node.js ibm-cloud cloudfoundry

我有一个在ibm cloudfoundry中托管的angularjs应用程序,我的问题是我需要仅通过https提供应用程序,因为我正在使用firebase消息传递。 我找到了一个解决方案,但问题是导航器由于重定向过多而停滞不前:



var finalhandler = require('finalhandler')
var http = require('http')
var connect = require('connect');
var serveStatic = require('serve-static');
var port = (process.env.VCAP_APP_PORT || 3001);
var host = (process.env.VCAP_APP_HOST || 'localhost');
var serve = serveStatic(__dirname+'/www')
var server = http.createServer(function onRequest (req, res) {
  if (req.secure) {
    serve(req, res, finalhandler(req, res))
  } else {
      res.writeHead(302, {'Location': 'https://'+req.headers.host + req.url});
      res.end();
  }
})
server.listen(port,host)




请问如何处理这个问题?

1 个答案:

答案 0 :(得分:0)

如果您纯粹提供静态内容,那么您可以使用staticfile buildpack。 “force ssl”选项将完全符合您的要求。

https://docs.cloudfoundry.org/buildpacks/staticfile/index.html#config-process

要启用,您可以运行cf set-env <your-app> FORCE_HTTPS true,或将该环境变量添加到cf cli manifest.yml文件中。

如果由于某种原因需要使用Node.js buildpack,那么诀窍是你必须查看X-Forwarded-ProtoX-Forwarded-Port标头。对于前者,您需要检查https,后者则会检查443。要么表明连接是安全的。

if (req.headers['x-forwarded-proto'] === 'https') {
  serve(req, res, finalhandler(req, res))
} else {
  res.writeHead(302, {'Location': 'https://'+req.headers.host + req.url});
  res.end();
}

如果您使用的是Express,则可以选择自动执行此操作app.enable('trust proxy')

https://expressjs.com/en/guide/behind-proxies.html

希望有所帮助!