Redirect http://example.com:12345 para https://example.com:12345 no nginx

4

Eu sei que isso já deve ter sido respondido, mas tenho procurado por um bom tempo e não consegui encontrar a resposta. Apenas não olhando no lugar certo, acho que talvez alguém possa me ajudar.

Basicamente estou executando o phpmyadmin através de SSL em uma porta não padrão, neste exemplo 12345.

Agora eu tenho https://example.com:12345 configurado ok, funciona e tudo mais. Agora quero adicionar a capacidade de digitar http://example.com:12345 e ser redirecionado para o https: //.

Eu suponho que o seguinte funcionaria, mas isso não acontece.

server {
  listen        12345;
  server_name   php.myadmin.com;

  if ( $scheme = http ) {
    rewrite ^ https://php.myadmin.com:12345$request_uri? redirect;
  }
  root         /var/www/php;

  ssl           on;

  [....]
}

Isso me dá um 400 bad request .

Agora, antes de postar uma resposta, certifique-se de ter uma boa olhada no formulário de redirecionamento. Confira a armadilha no link abaixo.

link

Além disso, seria bom se isso pudesse ser feito sem uma declaração if:

link

    
por Saif Bechan 07.12.2011 / 21:25

3 respostas

17

Eu faço exatamente isso. O gWaldo está correto, mas você não quer veicular conteúdo sobre HTTP, apenas um redirecionamento. O truque é pegar o erro http-on-an-https-port e usá-lo para devolver o erro cliente para o local correto.

server {
    listen   12345;
    server_name  my.domain.com;

    ssl on;
    ssl_certificate /etc/ssl/certs/your.pem;
    ssl_certificate_key /etc/ssl/private/your.key;

    # If they come here using HTTP, bounce them to the correct scheme
    error_page 497 https://$server_name:$server_port$request_uri;
    # Or if you're on the default port 443, then this should work too
    # error_page 497 https://$server_name$request_uri;

    location / {
        # Your config here...
    }
}
    
por 16.04.2012 / 17:32
1

Infelizmente, você não pode processar solicitações http e https usando uma única porta com nginx .

O que você pode fazer é ter uma solicitação de pré-manipulação de proxy, no entanto. É assim que lidamos com o processamento do esquema:

set $real_scheme http;
if ($http_x_forwarded_proto) { set $real_scheme $http_x_forwarded_proto; }

set $target_scheme https;

if ($real_scheme != $target_scheme) {
  rewrite ^ $target_scheme://$host$request_uri redirect;
}
    
por 07.12.2011 / 21:45
-2

Você pode redirecionar o para a porta 80 para a porta 443 (para trabalhar com as portas padrão). Mas isso exigiria que você executasse o iptables nesse host.

Não tenho certeza se você receberia um 400 também por causa do SSL, mas isso é basicamente como o proxy transparente funciona.

 iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 443

Além disso, você pode redirecionar solicitações http da porta 80 para a porta 443 (ou qualquer combinação de portas) no nginx, mas não fazê-las funcionar na mesma porta, como mencionado acima.

EDITAR : Como mencionado / comentado abaixo, esta abordagem irá resultar em um 400 devido à mistura de protocolos.

Seria uma opção resolver programaticamente o problema? Tente usar algo como o seguinte trecho na parte superior do seu arquivo inicial no phpMyAdmin. Isso deve redirecionar sua chamada inicial para https. Depois disso, o restante da sua página estará sob o contexto SSL, desde que você a tenha configurado para ser atendida via SSL (é claro).

<?php
 if ($_SERVER['SERVER_PORT']!=443) {
     $url = "https://". $_SERVER['SERVER_NAME'] . ":443".$_SERVER['REQUEST_URI'];
     header("Location: $url");
 }
?>

(não o salva explicitamente de saltar em sem SSL, por exemplo, por meio de um indicador, desde que sua sessão ainda seja válida)

    
por 07.12.2011 / 21:46