[Resolvido] Redirect requests na porta 80/http para a 8000/https no nginx

Iniciado por edgardamasceno, 17 de Junho de 2014, 02:14

tópico anterior - próximo tópico

edgardamasceno

Bom dia!

Bem, meu ambiente é o Ubuntu 14.04 Server rodando nginx configurado para utilizar virtualhost e quero redirecionar as chamadas do tipo "http://exemplo.com" para "https://exemplo.com", porém na porta 8000 onde estou rodando uma aplicação Rails.
Estou tendo dificuldades neste redirecionamento. Fico confuso se devo faze-lo em meu webserver(nginx) ou via regras de firewall.
Alguma luz?

zekkerj

Não há como redirecionar conexões sem criptografia para conexões com criptografia.

O que você pode fazer é dentro do web server (Apache?) você responder às requisições às requisições a "http://exemplo.com" com um código "301" (moved permanently), ao invés do código 200 normal. Isso faz com que seu navegador repita o pedido, dessa vez com o endereço correto.

Outra possibilidade é vc definir o conteúdo da página em http://exemplo.com/index.html para redirecionar o navegador para a página correta. Há várias formas de fazer isso; uma delas é com o código abaixo.

<html>
<head>
<title>Exemplo.com</title>
<META http-equiv="refresh" content="5;URL=https://exemplo.com">
</head>
<body>
<p>Redirecionando para <a href="https://exemplo.com">https://exemplo.com</a> em 5s.</p>
<p>Clique no link acima caso você não seja redirecionado automaticamente.</p>
</body>
</html>


Essa tática tem a vantagem de que vc pode emitir uma mensagem avisando do "redirecionamento".
Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D

edgardamasceno

Ótimo! Obrigado pela dica, acredito estar no caminho certo.
Implementei o redirecionamento via "Response status code 301", todavia, ainda falta um detalhe que acho que não deixei claro; Quero que, no cliente, não seja necessário explicitar a porta de conexão na url (https://exemplo.com:8000), ou seja, espero que as chamadas/trafego na porta 80 deste endereço, sejam encaminhadas à porta 8000.
Não tenho como colocar minha aplicação para ouvir na porta 80 pois nela rodo o webserver NGiNX (PHP e páginas estáticas). Em outras portas rodo aplicações Ruby, Python e Node e quero deixa-las acessíveis como se todas estivessem na porta http default.

zekkerj

CitarQuero que, no cliente, não seja necessário explicitar a porta de conexão na url (https://exemplo.com:8000), ou seja, espero que as chamadas/trafego na porta 80 deste endereço, sejam encaminhadas à porta 8000.

Sinceramente, não acho isso uma boa idéia.

Primeiro, porque a porta padrão de https é 443, não 80.
Segundo, se vc quer oferecer um serviço seguro, recomendo fortemente que deixe isso explícito no próprio URL.

Em tempo, qual o problema em usar porta 443 padrão do https?
Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D

edgardamasceno

Exatamente! O "https" vai continuar na url, o que não quero, é forçar o usuário a digitar a porta (8000) e também não quero que ela (a porta) fique na url após o redirect.
Hoje, graças à sua dica sobre o redirecionamento via response 301, consigo digitar no navegador "http://exemplo.com:8000" e ser direcionado para "https://exemplo.com:8000". Isto era parte do que eu queria.
Minha intenção é que os usuários, acessem "(http://)exemplo.com", sejam redirecionado para "https://exemplo.com" e tenham acesso a um sistema que na verdade roda (invariavelmente) na porta 8000.

Acredito estar chegando à resposta usando reverse proxy; Postarei aqui caso consiga.

Obrigado.

zekkerj

Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D


zekkerj

Ele não permite que você redirecione um determinado URL para outro? O Apache permite.
Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D

edgardamasceno

Sim, como disse antes, consigo redirecionar (response 301 e 302) mas não quero redirecionar o usuário para outro endereço.

zekkerj

Mas é a melhor forma... deixa o usuário fazer o pedido, daí vai bater no nginx, e ele mesmo redireciona ou faz proxy reverso.
Só não vou poder te ajudar, pois não sei configurá-lo.

Fosse no apache, eu faria assim, com o proxy reverso vc vai poder manter o url original.
Só não acho que faça sentido vc fazer proxy reverso de um serviço https para uma conexão http, o normal é exatamente o inverso: vc tem um serviço http que não tem como oferecer em https, daí vc usa o servidor web para redirecionar via proxy reverso e entregar em uma conexão segura https. O que vc quer fazer é tirar a segurança que a conexão tem...
Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D

edgardamasceno

A parte do http e https foi resolvido a muito tempo, desde sua primeira interação. Foi muito útil pois não havia pensado em usar o redirecionamento via response 301. Fiz o seguinte:

server {
  # Redireciona o usuário para uma conexão ssl #
  listen 80;
  server_name examplo.com;
  rewrite ^ https://example.com$request_uri? permanent;
  # ... #
}

E usei o reverse proxy para tirar o "8000" da url.

server {
  listen 443;
  server_name exemplo.com;

  # Redireciona o trafego para o sistema rodando no servidor #
  location / {
    proxy_pass                 https://localhost:8000;
    proxy_set_header        Host $host;
    proxy_set_header        X-Real-IP $remote_addr;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}

Desta forma o usuário consegue acessar o sistema sem ter que especificar na url que é uma conexão https e nem a porta do sistema . O NGiNX faz a intermediação.

Muito obrigado pela ajuda.