A negociação SSL sempre acontece antes do início da solicitação HTTP, não há como evitar isso.
A única maneira de corrigir esse problema é obter um novo certificado que tenha domain.com
e *.domain.com
listado.
Eu tenho um servidor Apache 2.2 e um certificado SSL curinga para * .domain.com e configurei um conjunto de regras mod_rewrite para 80 e 443 que redirecionará corretamente as solicitações de domain.com para www.domain.com:
RewriteCond %{HTTP_HOST} ^domain.com
RewriteRule ^(.*)$ https://www.domain.com$1 [R=permanent,L]
(é esse para o 443; o do 80 simplesmente omite o 's' em 'https').
Essa parte está funcionando corretamente para http e https - ela faz a regravação - mas não resolve o problema que eu queria corrigir. Especificamente, quando alguém acessa https://domain.com
, receberá um aviso de certificado porque o certificado curinga para * .domain.com não corresponde apenas a domain.com. Se eles optarem por aceitar o certificado e continuarem, a reescrita será executada corretamente e o ícone de bloqueio normal substituirá o ícone de bloqueio com raiva. O problema é que eles recebem o aviso em primeiro lugar - eles têm que escolher ignorar o aviso de certificado antes que a reescrita seja feita. Existe uma maneira correta de enviar tráfego para https://domain.com
para https://www.domain.com
antes de tentar fazer a negociação SSL? Parece que o mod_rewrite está fazendo isso depois do fato.
Como Tero já apontou, a negociação SSL acontece antes de mod_rewrite
entrar em ação. Isso significa que a única maneira de resolver isso é obter um certificado que também seja válido para domain.com .
Como o Apache suporta SNI, ele pode apresentar um certificado diferente para um nome de host diferente, portanto você pode obter um certificado adicional barato ou gratuito em uma empresa como o StartSSL.
No entanto, na minha experiência, as pessoas raramente digitam https://
em sua barra de endereço. Portanto, se você tiver certeza de que http://domain.com
seja redirecionado diretamente para https://www.domain.com
, não há problema.