我有一个在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)

请问如何处理这个问题?
答案 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-Proto
或X-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
希望有所帮助!