htaccess redireciona não www para www com SSL / HTTPS

10

Quero uma regra de reescrita que redirecione tudo para https:// AND www .

Por exemplo, http://example.comdeveria estar indo parahttps://www.example.com

Isto é o que eu tenho:

RewriteEngine On
RewriteCond %{SERVER_PORT} !=443
RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$ [NC]
RewriteRule ^(.*)$ "https\:\/\/www\.example\.com\/$1" [R=301,L]
Vai
fonte

Respostas:

11

Eu encontrei a solução.

Sem HSTS (redirecionamento único):

RewriteCond %{HTTP_HOST} !^www\.
RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTPS} off
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Com HSTS (redirecionamento duplo):

RewriteCond %{HTTPS} off
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Vai
fonte
11
Observe que isso resultará em um redirecionamento duplo ao solicitar http://example.com(por exemplo, HTTP e não www), pois ele primeiro redireciona para HTTPS no mesmo host (por exemplo, sem www) e, em seguida, redireciona para wwwum segundo redirecionamento. Você pode corrigir isso simplesmente revertendo essas duas regras.
precisa saber é
@ MrWhite @, na verdade, você deseja um redirecionamento duplo em um https://redirecionamento adequado , especialmente se você usar HSTS. Desta forma, o HSTS preferência podem ser armazenados pelo navegador para ambos os seus domínios e pedidos subseqüentes serão sempre padrão parahttps://
XSRF
@xsrf Ainda é "adequado" (e mais eficiente) ter um único redirecionamento www e HTTPS. Ele só precisa ser mantido separado quando você estiver implementando o HSTS.
MrWhite
Ambos os pontos positivos de xsrf e MrWhite. Eu atualizei a resposta.
Will
@xsrf Eu verifiquei o redirecionamento duplo com htaccess.madewithlove.be e parece que ele redireciona apenas http: //> https: // não www .
21718
6

Suas condições são implicitamente AND 'e sua segunda condição sempre será verdadeira (a menos que você tenha outros domínios), portanto, suas regras atuais redirecionarão apenas o tráfego não SSL.

Você precisa ORdas condições e nega a www(segunda) condição:

RewriteEngine On
RewriteCond %{SERVER_PORT} !=443 [OR]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]

Se SERVER_PORTnão for 443 (por exemplo, não é HTTPS) ou o host não iniciar www.(por exemplo, você está acessando o domínio básico), redirecione para o URL canônico.

No entanto, se isso vai redirecionar https://example.coma https://www.example.comdependerá do seu certificado de segurança. (Seu site precisa estar acessível por www e não www sobre SSL para que o redirecionamento .htaccess seja acionado.)

Sr. White
fonte
1

Isso será usado para www ou não www. Se você tentar abrir um link com www, o URL redirecionará para https com www

Exemplo: http://domain.comredirecionar parahttps://domain.com

ou Se você tentar abrir um link com não www, redirecione o URL para https com não www

Exemplo: http://www.domain.comredirecionar parahttps://www.domain.com

RewriteEngine on

RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Ajay Patidar
fonte
Isso não lida com o redirecionamento não www para www, conforme indicado na pergunta.
MrWhite 2/16
Você pode adicionar esta linha no htaccess RewriteCond% {HTTP_HOST}! ^ Www \. RewriteRule ^ (. *) $ % {HTTP_HOST} / $ 1 [R = 301, L]
Ajay Patidar
Substituir RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] porRewriteCond %{HTTP_HOST} !^www\. RewriteRule ^(.*)$ %{HTTP_HOST}/$1 [R=301,L]
Ajay Patidar
Você pode editar sua resposta.
precisa saber é o seguinte