А если так попробовать:
server {
listen 80;
server_name "~^(www\.)?(.*)$" ;
return 301 https://$2$request_uri ;
}
server {
listen 443 ssl;
server_name "~^www\.(.*)$" ;
return 301 https://$1$request_uri ;
}
server {
listen 443 ssl;
server_name domain.ru domain.com;
# основная секция
}
Для особых извращенцев:
server {
listen 80;
listen 443 ssl;
server_name server_name "~^(www\.)?(.*)$";
if($scheme = https) {
if($1 = www) {
return 301 http://$2$request_uri;
}
}
if($scheme = http) {
return 301 http://$2$request_uri;
}
# основная секция
}
По-хорошему, регулярок не должно быть. Если это два разных сайта, то лучше разделить конфиги, если это зеркало и основной, то в return прописать основной и убрать регулярки.
server {
listen 80;
server_name www.domain.com domain.com;
return 301 https://domain.com$request_uri ;
}
server {
listen 80;
server_name www.domain.ru domain.ru;
return 301 https://domain.ru$request_uri ;
}
server {
listen 443 ssl;
server_name www.domain.ru;
return 301 https://domain.ru$request_uri ;
}
server {
listen 443 ssl;
server_name www.domain.com;
return 301 https://domain.com$request_uri ;
}
server {
listen 443 ssl;
server_name domain.ru domain.com;
# основная секция
}