Você está supercomplicando isso ...
Para redirecionar o HTTP com ou sem www para HTTPS com www:
server {
listen 80;
server_name www.example.com example.com;
return 301 https://www.example.com$request_uri;
}
Isso deixa apenas a situação do HTTPS sem www, que pode ser abordada da seguinte forma:
server {
listen 443 ssl;
server_name example.com;
return 301 https://www.example.com$request_uri;
ssl_certificate /root/knownsrv.crt;
ssl_certificate_key /root/knownsrv.key;
}
Em seguida, basta adicionar seu vhost SSL para www.example.com
. Tudo o resto (ou seja, faltando www, e / ou não-ssl) será redirecionado para ele. Não há necessidade de if
(o que pode degradar seriamente o desempenho do nginx).