nginx - Redirecionar caminhos de páginas específicos para https enquanto mantém tudo o mais em http (em uma única chamada de servidor)?

1

Pelo que eu aprendi até agora, está claro que executar declarações if no nginx deve ser evitado a todo custo. A maioria dos exemplos que encontrei até agora sobre redirecionamentos de páginas específicos envolve vários servidores sendo usados. Mas isso não é um pouco exagerado? Não tenho certeza, mas acho que vários servidores para fazer isso seria um pouco mais lento do que um único servidor quando estiver sob carga pesada.

Minha chamada atual do servidor é esta:

server {
    listen  10.0.0.60:80;
    listen  10.0.0.60:443 default ssl;

    #other code
}

O que eu quero fazer é redirecionar algumas solicitações http para solicitações https. Por exemplo, eu quero / login / e / my-account / sempre ser forçado a usar SSL. Se você está em / help / though, eu quero que seja servido pelo http padrão.

Existe uma maneira de realizar isso em uma única chamada de servidor? Ou não há desvantagem em usar duas chamadas de servidor para que isso funcione? O nginx parece estar sob desenvolvimento bastante ativo e muitos dos guias mais antigos que eu segui foram de momentos em que você não podia escutar pedidos para as portas 80 e 443 dentro da mesma chamada de servidor. Mas agora que o nginx foi atualizado para suportar isso (estou executando o 1.2.4), estou me perguntando se existe uma maneira de "melhor prática" de lidar com isso hoje.

Qualquer ajuda seria muito apreciada.

EDITAR:

Eu encontrei este guia: link

e atualizei meu código da seguinte forma:

map $uri $my_preferred_proto {
        default "http";
        ~^/#/user/login "https";
}
server {
        listen  10.0.0.60:80; ## listen for ipv4; this line is default and implied
        listen  10.0.0.60:443 default ssl;

        if ($my_preferred_proto = "none") {
                set $my_preferred_proto $scheme;
        }

        if ($my_preferred_proto != $scheme) {
                return 301 $my_preferred_proto://mysite.com$request_uri;
        }

Não está funcionando. Quando eu altero o padrão para https, tudo é redirecionado para SSL, então funciona um pouco. Mas o redirecionamento de / # / user / login não está redirecionando para HTTPS. Alguma ideia? Além disso, esta é uma boa maneira de fazer isso?

    
por Kris Anderson 12.12.2012 / 13:32

3 respostas

0

Acontece que não consigo redirecionar esta página devido à hashtag # no URL. Como a marca de hash é atualizada apenas no lado do navegador do cliente, o servidor não pode ver essa URL. Meu código de redirecionamento original e o código de Andrei (com minha modificação no comando $ uri) também funcionam corretamente.

    
por 15.12.2012 / 03:16
0

IFs estão ok se usados corretamente. No seu caso, você pode tentar o bloco de configuração como este (não testado):

location /login {
   if ($scheme != 'https') { 
       return 301 https://$host$url;
    }
 }
    
por 12.12.2012 / 13:49
0

Se o uso de /login no bloco de localização funcionar para você, alterar a entrada do mapa para remover o hash semelhante a esse ~/login "https"; também funcionará.

Os blocos de localização correlacionam-se diretamente a $uri mapas como o que você usou. A correspondência que funciona em um bloco de localização também deve funcionar em um mapeamento $uri .

Além disso - como você percebeu - você precisa corresponder ao caminho que o cliente solicita do servidor, não necessariamente o mesmo que o cliente mostra na barra de localização.

p.s. - Eu escrevi o guia ao qual você está ligando na pergunta original.

    
por 23.01.2013 / 03:58

Tags