A melhor maneira de conseguir isso é usar três blocos de servidor: um para redirecionar http para https, um para redirecionar o https www-name para o não-www e um para lidar com as solicitações. O motivo para usar blocos de servidores extras em vez de ifs é que a seleção do servidor é executada usando uma tabela de hash e é muito rápida. Usando um nível de servidor, se o if for executado para cada solicitação, o que é um desperdício. Além disso, capturar o uri solicitado na reescrita é um desperdício, já que o nginx já possui essas informações nas variáveis $ uri e $ request_uri (sem e com a string de consulta, respectivamente).
server {
server_name www.example.com example.com;
return 301 https://example.com$request_uri;
}
server {
listen 443 ssl;
ssl_certificate /path/to/server.cert;
ssl_certificate_key /path/to/server.key;
server_name www.example.com;
return 301 https://example.com$request_uri;
}
server {
listen 443 ssl;
ssl_certificate /path/to/server.cert;
ssl_certificate_key /path/to/server.key;
server_name example.com;
<locations for processing requests>
}