[RESOLVIDO] Dúvida Http e Https (Node.js e Hexo.io)

Eu tenho um domínio com o SSL ligado (usando o Node.js com Hexo). Quando eu digito na barra de endereço:

dominio.com.br -> ele entra no https://dominio.com.br

mas quando eu coloco:
www.dominio.com.br -> ele usa http://www.dominio.com.br

e se eu digitar:
https://www.dominio.com.br -> ele sempre fica com o https

depois que estou no HTTP… e seleciono qualquer link de pagina interna do meu site… tudo fica em HTTPS…

como faço para ao digitar www.dominio.com.br na barra de endereço ele entre como https ?

Olá, boa tarde, Gabriel! :koala:

Peço desculpas pela demora na resposta da sua dúvida aqui na comunidade, ok?

Nessa situação, é possível que exista alguma falha no processo de redirecionamento que está sendo usado.

Aqui na comunidade mesmo nós já deixamos um post explicando e dando um exemplo de como você pode fazer para redirecionar qualquer acesso HTTP do site para HTTPS em aplicações Node.

Peço que você confira esse post e analise se é possível fazer dessa forma para a sua aplicação também, ok?

Caso tenha mais alguma dúvida sobre isso ou precise de alguma outra ajuda, estou à disposição!

Até mais :wave:

1 curtida

Obrigado! vou olhar o post com atenção, estou depurando o hexo, já que ele usa um código customizado para iniciar o servidor. Eu até tentei iniciar o código do Post antes do hexo, mas não fez muita diferença.

Admito que não tenho experiência com Node.js e nem o Hexo.io, mas assim que achar uma solução coloco aqui. No entanto, fica aberto para alguém que já tenha alguma experiência com Hexo nessa plataforma responder.

A minha solução, temporária, foi colocar um javascript extra no tema que confere se está no http ou https, e redireciona, caso necessário.

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});
}
1 curtida