htaccess redirect para https: // www

Eu tenho o seguinte código htaccess:

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

Quero que meu site seja redirecionado para https://www. com HTTPS e reforçando o www. subdomínio, mas quando eu access http://www. (sem HTTPS), não me redireciona para https://www com HTTPS.

Para forçar primeiro o HTTPS, você deve verificar a variável de ambiente correta %{HTTPS} off , mas sua regra acima então preenche o www. Desde que você tenha uma segunda regra para impor www. , não use na primeira regra.

 RewriteEngine On RewriteCond %{HTTPS} off # First rewrite to HTTPS: # Don't put www. here. If it is already there it will be included, if not # the subsequent rule will catch it. RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] # Now, rewrite any request to the wrong domain to use www. # [NC] is a case-insensitive match RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 

Sobre o proxy

Quando por trás de algumas formas de proxy, por meio do qual o cliente está se conectando via HTTPS a um proxy, balanceador de carga, aplicativo Passenger, etc., a variável %{HTTPS} pode nunca estar on e causar um loop de reconfiguração. Isso ocorre porque seu aplicativo está recebendo tráfego HTTP simples, embora o cliente e o balanceador de proxy / carga estejam usando HTTPS. Nesses casos, verifique o header X-Forwarded-Proto vez da variável %{HTTPS} . Esta resposta mostra o processo apropriado

A resposta de Michals funcionou para mim, embora com uma pequena modificação:

Problema:

quando você tem um certificado de segurança de site único , um navegador que tenta acessar sua página sem https: // www. (ou qualquer domínio que seu certificado cobre) exibirá uma canvas de aviso vermelha feia antes mesmo de receber o redirecionamento para a página https segura e correta.

Solução

Primeiro use o redirecionamento para o www (ou qualquer domínio coberto pelo seu certificado) e só então faça o redirecionamento https. Isso garantirá que seus usuários não sejam confrontados com nenhum erro porque seu navegador vê um certificado que não cobre o URL atual.

 #First rewrite any request to the wrong domain to use the correct one (here www.) RewriteCond %{HTTP_HOST} !^www\. RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301] #Now, rewrite to HTTPS: RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 

Se você estiver usando o CloudFlare ou um CDN semelhante, receberá um erro de loop infinito com as soluções% {HTTPS} fornecidas aqui. Se você é um usuário CloudFlare, você precisará usar isto:

 RewriteEngine On RewriteCond %{HTTP:X-Forwarded-Proto} =http RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 

Má solução e porquê!

Quando você usa este código:

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

o navegador vai para:

 http://example.com 

depois redireciona para:

 https://example.com 

depois redireciona para:

 https://www.example.com 

Isso é muito pedido para o servidor


MELHOR SOLUÇÃO E RESPOSTA

Este código tem uma condição [OR] para evitar alterações duplas no url!

 RewriteEngine on RewriteCond %{HTTPS} off [OR] RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule (.*) https://www.example.com%{REQUEST_URI} [R=301,L] 

A maioria das respostas até aceitou uma, não use esse truque.

Existem muitas soluções por aí. Aqui está um link para o wiki do apache que lida com esse problema diretamente.

http://wiki.apache.org/httpd/RewriteHTTPToHTTPS

 RewriteEngine On # This will enable the Rewrite capabilities RewriteCond %{HTTPS} !=on # This checks to make sure the connection is not already HTTPS RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L] # This rule will redirect users from their original location, to the same location but using HTTPS. # ie http://www.example.com/foo/ to https://www.example.com/foo/ # The leading slash is made optional so that this will work either in httpd.conf # or .htaccess context 

Essa é a melhor maneira que encontrei para Proxy e não para usuários proxy

 RewriteEngine On ### START WWW & HTTPS # ensure www. RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301] # ensure https RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteCond %{HTTPS} off RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] ### END WWW & HTTPS 

Para redirect http: // ou https: // para https: // www, você pode usar a seguinte regra em todas as versões do apache:

 RewriteEngine on RewriteCond %{HTTPS} off [OR] RewriteCond %{HTTP_HOST} !^www\. RewriteRule ^ https://www.example.com%{REQUEST_URI} [NE,L,R] 

Apache 2.4

 RewriteEngine on RewriteCond %{REQUEST_SCHEME} http [OR] RewriteCond %{HTTP_HOST} !^www\. RewriteRule ^ https://www.example.com%{REQUEST_URI} [NE,L,R] 

Observe que a variável% {REQUEST_SCHEME} está disponível para uso desde o apache 2.4 .

Se você está no CloudFlare, certifique-se de usar algo assim.

 # BEGIN SSL Redirect  RewriteEngine On RewriteCond %{HTTP:X-Forwarded-Proto} =http RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]  # END SSL Redirect 

Isso salvará você do loop de redirecionamento e redirectá seu site para SSL com segurança.

PS É uma boa idéia se verificar o mod_rewrite.c!

Coloque no seu arquivo .htaccess

 RewriteEngine On RewriteCond %{HTTP_HOST} !^www. RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L] RewriteCond %{HTTPS} !=on RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 

Eu tento a primeira resposta e não funciona … Este trabalho:

  RewriteEngine On RewriteBase / RewriteCond %{ENV:HTTPS} !=on RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L] # BEGIN WordPress  RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L]  # END WordPress 

Isso funcionará tanto para https quanto para www

 RewriteCond %{HTTPS} !=on # This checks to make sure the connection is not already HTTPS RewriteRule ^/?(.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]