A quem interessar, eu encontrei uma solução para o Hexo - Node.JS no Umbler.
Fiz a alteração no código do servidor (módulo hexo-server\lib\server.js).
Agora ao digitar um endereço http… ele parece estar redirecionando corretamente para https.
Existe um detalhe, que é o fato do hexo-server estar usando o connect() ao invés do express(). Nesse caso o redirect não irá funcionar, sendo necesssário usar o writeHead.
Se entendi corretamente, o que fiz foi acrescentar um middleware de redirecionamento antes da lista de middleware do próprio hexo-server… o connect (ao invés do express) serve para gerir múltiplos middlewares…
quem quiser ler mais sobre o connect -> connect()
o código final do arquivo server.js (na pasta node_modules\hexo-server\lib) ficou o seguinte:
'use strict';
const connect = require('connect');
const http = require('http');
const chalk = require('chalk');
const Promise = require('bluebird');
const open = require('open');
const net = require('net');
const url = require('url');
module.exports = function(args) {
const app = connect();
const { config } = this;
const ip = args.i || args.ip || config.server.ip || undefined;
const port = parseInt(args.p || args.port || config.server.port || process.env.port, 10) || 4000;
const { root } = config;
// INICIO NOVO TRECHO
app.use((req, res, next) => { //Cria um middleware onde todas as requests passam por ele
if (req.headers['x-forwarded-proto'] != 'https') {//Checa se o protocolo informado nos headers é HTTP
//console.log('Use redirect to https! '+req.headers['x-forwarded-proto']+" "+`https://${req.headers.host}${req.url}`);
res.writeHead(301, {Location: `https://${req.headers.host}${req.url}`});
res.end();
} else { //Se a requisição já é HTTPS
next(); //Não precisa redirecionar, passa para os próximos middlewares que servirão com o conteúdo desejado
}
});
// FIM NOVO TRECHO
return checkPort(ip, port).then(() => this.extend.filter.exec('server_middleware', app, {context: this})).then(() => {
if (args.s || args.static) {
return this.load();
}
return this.watch();
}).then(() => startServer(http.createServer(app), port, ip)).then(server => {
const addr = server.address();
const addrString = formatAddress(ip || addr.address, addr.port, root);
this.log.info('Hexo is running at %s . Press Ctrl+C to stop.', chalk.underline(addrString));
this.emit('server');
if (args.o || args.open) {
open(addrString);
}
return server;
}).catch(err => {
switch (err.code) {
case 'EADDRINUSE':
this.log.fatal(`Port ${port} has been used. Try other port instead.`);
break;
case 'EACCES':
this.log.fatal(`Permission denied. You can't use port ${port}.`);
break;
}
this.unwatch();
throw err;
});
};
function startServer(server, port, ip) {
return new Promise((resolve, reject) => {
server.listen(port, ip, resolve);
server.on('error', reject);
}).then(() => server);
}
function checkPort(ip, port) {
if (port > 65535 || port < 1) {
return Promise.reject(new RangeError(`Port number ${port} is invalid. Try a number between 1 and 65535.`));
}
const server = net.createServer();
return new Promise((resolve, reject) => {
server.once('error', reject);
server.once('listening', resolve);
server.listen(port, ip);
}).then(() => { server.close(); });
}
function formatAddress(ip, port, root) {
let hostname = ip;
if (ip === '0.0.0.0' || ip === '::') {
hostname = 'localhost';
}
return url.format({protocol: 'http', hostname: hostname, port: port, path: root});
}