Quando o Nginx processa uma solicitação, primeiro identifica o bloco do servidor que manipulará a solicitação. Isso significa que ele corresponderá às diretivas server_name e listen.
No seu caso, o bloco de servidor único que você contém contém:
server {
listen 80;
return 301 $server_name$request_uri;
listen 443 ssl spdy;
root /var/www/wordpress;
index index.php index.html index.htm;
server_name www.example.com;
...
Isso escutará na porta 80 e 443. O fato de você ter uma diretiva de retorno entre os dois não importa, já que a diretiva de retorno não é processada neste ponto.
Assim que o bloco do servidor for correspondido, o Nginx passará a processar outras diretivas. No caso das diretivas de reescrita (por exemplo, retorno), elas são processadas no pedido listado . No caso das diretrizes de localização, elas são processadas com base na especificidade da correspondência (as regras exatas são listadas aqui ).
Para implementar seu redirecionamento, você deve separar sua diretiva de reescrita em um bloco de servidor separado:
server {
listen 80;
server_name www.example.com;
return 301 https://www.example.com$request_uri;
}
server {
listen 443 ssl spdy;
server_name www.example.com;
root /var/www/wordpress;
index index.php index.html index.htm;
...
}
Observe que você precisa especificar que está retornando a versão HTTPS e não a mesma versão (HTTP) da página. Em alguns casos, pode ser preferível codificar o nome do servidor (por exemplo, se você quiser redirecionar o tráfego www e não www para a mesma página HTTPS).
Editar: para endereçar seu comentário:
Você quer conteúdo veiculado de https://www.example.com
e deseja os seguintes redirecionamentos:
-
http://(www.)?example.com
redireciona parahttps://www.example.com
-
https://example.com
redireciona parahttps://www.example.com
Para fazer isso, você precisa de três blocos de servidores:
server { #Redirect non-https to https - match both www and non-www
listen 80;
server_name www.example.com example.com;
return 301 https://www.example.com$request_uri;
}
server { #Redirect https, non-www to https, www
listen 443 ssl spdy;
server_name example.com;
ssl_certificate /etc/ssl/certs/www.example.com.certchain.crt;
ssl_certificate_key /etc/ssl/private/www.example.com.key;
return 301 https://www.example.com$request_uri;
}
server { #Main server block
listen 443 ssl spdy;
server_name www.example.com;
root /var/www/wordpress;
index index.php index.html index.htm;
ssl_certificate /etc/ssl/certs/www.example.com.certchain.crt;
ssl_certificate_key /etc/ssl/private/www.example.com.key;
...
}
Alguns pontos importantes de menção:
-
Seu certificado SSL deve listar www.example.com e example.com como nomes alternativos de assunto. Mesmo que você esteja redirecionando para longe de example.com, uma conexão SSL ainda é estabelecida antes do redirecionamento. Sem um certificado válido para example.com, o usuário receberá um aviso de certificado inválido e o redirecionamento não ocorrerá. (Isso também implica que você deve incluir o certificado no bloco link )
-
Como ter um redirecionamento requer vários bloqueios de servidor SSL, é preferível mover parte de sua configuração SSL para fora do bloco do servidor (no bloco http). Isso inclui:
ssl_session_timeout
,ssl_session_cache
,ssl_protocols
,ssl_ciphers
,ssl_prefer_server_ciphers
,ssl_stapling
,ssl_stapling_verify
,ssl_trusted_certificate
,ssl_dhparam
e seu cabeçalho HSTS. (Como um aparte, eu recomendo olhar pela página TLS do servidor da Mozilla )