Nginx: forçar SSL em um caminho, não SSL em outros

23

Como configuro o arquivo conf Nginx para forçar o SSL em apenas um dos caminhos do meu site e não SSL em todo o resto?

Por exemplo, quero que todos os URLs em / user sejam https, mas todo o restante dos URLs seja http.

Para a primeira parte eu tenho:

rewrite ^/user(.*) https://$http_host$request_uri?;

Eu não quero usar "if". Eu suponho que isso tiraria proveito da ordem de operação, mas eu não quero terminar em um loop.

    
por pbreitenbach 16.05.2011 / 23:14

2 respostas

35

Na configuração do nginx, você deve ter duas áreas de "servidor". Um para a porta 80 e um para a porta 443 (não-SSL e SSL). Basta adicionar um local em seu site não SSL para redirecionar para sua página SSL.

server {
    root /var/www/
    location / {
    }
    location /user {
        rewrite ^ https://$host$request_uri? permanent;
    }
}

ele encaminhará todo o tráfego que termina em / user para seu servidor https: //.

Então, no seu servidor 443, você faz o oposto.

server {
    listen 443;
    root /var/www/
    location / {
        rewrite ^ http://$host$request_uri? permanent;
    }
    location /user {
    }
}
    
por 16.05.2011 / 23:26
10

O Nginx permite processar HTTP e HTTPS dentro do mesmo bloco server . Assim, você não precisa duplicar diretivas para ambos e pode redirecionar o caminho que deseja proteger

server {
  listen 80 default_server;
  listen 443 ssl;
  ... ssl certificate and other configs ...

  location /user {
    if ($scheme = 'http') {
      rewrite ^ https://$http_host$request_uri? permanent;
    }
  }

  ... your basic configuration ...
}

Certifique-se de que não coloque a linha ssl on lá porque isso quebrará o HTTP.

Opcionalmente, você pode redirecionar todos os outros pedidos de HTTPS de volta para o HTTP da mesma maneira:

if ($scheme = 'https') {
  rewrite ^ http://$http_host$request_uri? permanent;
}

UPDATE : como Alexey Ten gentilmente aponta na seção de comentários, verificar scheme em cada solicitação não é uma ideia muito brilhante. Você deve seguir a maneira declarativa de configurar seu nginx. Nesse caso, declare dois blocos de servidores com redirecionamentos por location , mova a lógica comum para um arquivo separado e include em ambos. Então a resposta da GruffTech é melhor.

    
por 16.06.2014 / 09:46