Na seção do servidor virtual HTTP, eu sempre usaria o domínio final como destino de redirecionamento.
Por exemplo, agora, quando uma solicitação chegar em http://www.b.com
, ela será redirecionada para https://www.b.com
e, em seguida, para https://b.com
, causando dois redirecionamentos para o cliente até que ele alcance o destino final. No entanto, para fazer isso, é necessário usar uma expressão regular para o server_name
e usar seu valor capturado no redirecionamento, por exemplo, assim:
server {
listen 80;
server_name ~^(?:www)?\.(<domain>.+)\.com$;
return 301 https://$domain.com;
}
Esta expressão regular irá capturar tudo entre www.
prefixo e .com
sufixo em $ 1, ou se www.
prefixo não existir, então tudo antes de .com
. $1
é então usado como destino de redirecionamento.
Outro problema com sua configuração é a solicitação para http://www.a.com
. O primeiro redirecionamento irá para https://www.a.com
, que irá redirecioná-lo para https://sub.a.com
, porque o segundo bloco server
corresponde a esse domínio.