У меня есть приложение angularjs, которое было размещено в ibm cloudfoundry. Моя проблема в том, что мне нужно, чтобы приложение обслуживалось только через 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)
как справиться с этой проблемой, пожалуйста?
Если вы используете только статический контент, вы можете использовать статический файл 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
Надеюсь, это поможет!