tendo várias condições no arquivo de configuração

1

Eu gostaria de ter return 301 https://$host$request_uri; para ser executado apenas em alguns casos. Eu sei que o nginx não suporta & & ou || nas condições e isso é um problema para mim.

Eu hospedo um aplicativo rails e a maneira mais fácil de adicionar suporte a SSL e forçar meus usuários a sempre usar https foi mudando minha configuração para

server {
    listen <my ip>:80;
    server_name mydomain.tld;

    return 301 https://$host$request_uri;
}
...
upstream my_backend {
    server 127.0.0.1:9005;
}

server {
    listen <my ip>:443;
    server_name mydomain.tld;

    ssl on;
    ....
    location / {
        proxy_pass http://my_backend;
    }

}

Isso funciona bem, mas um de nossos grandes clientes usa o Lotus Notes e quando lêem nossos boletins informativos que referenciam recursos como <img src="https://mydomain.tld/some-image.png"/>,elesnãopodemvernadaporqueoIErenderizaemsegundoplano,suaversãoantigadoIEnãotemSNIapoio,oIEserecusaaprocessaraimagem,tudopareceumabagunça.

Então,decidinãousaremnossasreferênciasdeboletinsinformativosparahttps,masparahttp.Entãoeucrieiessaconfiguração:

server{listen<myip>:80;server_namemydomain.tld;location/{proxy_passhttp://my_backend;}set$redir_to_ssl'';if($request_uri!~^/typo3/){set$redir_to_ssl"${redir_to_ssl}1";
    }   

    if ( $request_uri !~ ^/mailimage/ ) { 
        set $redir_to_ssl "${redir_to_ssl}1";
    }   

    if ( $request_uri !~ ^/ical$ ) { 
        set $redir_to_ssl "${redir_to_ssl}1";
    }   


    if ( $redir_to_ssl = "111" ){
        return 301 https://$host$request_uri;
    }   
}   

Eu ainda quero que o nginx redirecione automaticamente qualquer pessoa para o site https , a menos que o URI comece com / typo3 ou com / mailimage ou com / ical.

Então, eu precisava de algo assim

if ( URI does not start with /typo3 AND URI does not start with /mailimage AND ... )
   return 301 https://$host$request_uri;

Eu não estou feliz com isso, não parece tão bem gerenciado, então continuei procurando por melhores soluções. Eu encontrei este um condições múltiplas Nginx em se declaração muito intersting, de alguma forma parece muito mais limpo. Devo usá-lo? E como?

Então?

server {
....
    location /typo3 { 
        proxy_pass http://my_backend;
    }

    location /mailimage { 
        proxy_pass http://my_backend;
    }

    location /ical { 
        proxy_pass http://my_backend;
    }

    return 301 https://$host$request_uri;
}

Algo assim funcionaria? E seria melhor que minha solução inicial?

    
por Pablo 28.01.2015 / 18:52

1 resposta

2

Use uma configuração como esta:

server {
    listen 80;
    server_name mydomain.tld;

    root /path/to/webroot;

    location / {
        return 301 https://$host$request_uri;
    }

    location ~ /(?:typo3|mailimage|ical)/ {
    }
}

A segunda expressão de localização corresponde a uma dessas localizações com o formato de expressão regular e evita o redirecionamento aplicado a todas as outras localizações.

    
por 28.01.2015 / 21:58

Tags