Alternando corretamente entre HTTP e HTTPS usando .htaccess

Temos um site de compras que estamos hospedando em um host compartilhado (Mediatemple Gridserver). Algumas partes do site precisam usar HTTPS (checkout etc), mas o resto deve estar usando HTTP.

Alguém sabe como podemos sempre forçar o uso correto de HTTP / HTTPS para URLs particulares? Nós trabalhamos em vários estados, mas não podemos obter uma solicitação para uma página que deve estar em HTTP, mas é solicitada com HTTPS para voltar corretamente.

Eu dei uma olhada no SO, mas não consegui encontrar uma resposta adequada para isso.

Eu uso algo semelhante a isso para a minha pasta de administrador no wordpress:

#redirect all https traffic to http, unless it is pointed at /checkout RewriteCond %{HTTPS} on RewriteCond %{REQUEST_URI} !^/checkout/?.*$ RewriteRule ^(.*)$ http://mydomain.com/$1 [R=301,L] 

O RewriteCond %{HTTPS} on parte pode não funcionar em todos os servidores da web. Meu webhost requer RewriteCond %{HTTP:X-Forwarded-SSL} on , por exemplo.

Se você quiser forçar o contrário, tente:

 #redirect all http traffic to https, if it is pointed at /checkout RewriteCond %{HTTPS} off RewriteCond %{REQUEST_URI} ^/checkout/?.*$ RewriteRule ^(.*)$ https://mydomain.com/$1 [R=301,L] 

Se você quiser algumas maneiras alternativas de fazê-lo, confira o askapache .

Isso deve funcionar em praticamente todos os cenários e deve funcionar em seu vhost ou .htaccess real:

 RewriteEngine on RewriteCond %{SERVER_PORT} ^80$ RewriteRule ^(.*)$ https://%{SERVER_NAME}/%{REQUEST_URI} [R=301,L] 

(não esqueça a barra antes de% {REQUEST_URI}, pois isso pode permitir a passagem de um número de porta, o que é perigoso)

 RewriteEngine on RewriteCond %{HTTPS} off [OR] RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteRule ^(.*)$ https://%{SERVER_NAME}/%{REQUEST_URI} [R=301,L] 

Eu tive algum problema estando atrás de um loadballancer. É assim que eu consertei.

Conforme detalhado nesta resposta , corrija seu aplicativo para usar links https:// quando necessário. Não confie em redirecionamentos automáticos, isso pode levar a uma falsa sensação de segurança se você não tiver feito seus links / formulários veiculados em https:// vá para https:// URLs também. Usando mod_rewrite automaticamente torna mais difícil detectar esses erros (que também podem ser vulnerabilidades).

Para mim funcionou isso (eu usei para o site wordpress e redirecionando para HTTPS). Você tem que adicionar a condição e as linhas de regra logo atrás das linhas RewriteEngine e RewriteBase:

 # BEGIN WordPress  RewriteEngine On RewriteBase / # I added these two lines for redirect to HTTPS RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteRule ^(.*)$ https://www.yoursite.com/$1 [R=301,L] # (end of custom modifications) RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L]  # END WordPress` 

Dê uma olhada para condicionar RewriteCond %{HTTP:X-Forwarded-Proto} !https – só isso funcionou para o meu servidor de hospedagem. (Eu tentei RewriteCond %{SERVER_PORT} !^443$ ou RewriteCond %{HTTPS} off também, mas sem sucesso.

Eu acho que deveria ser:

 RewriteCond %{HTTPS} =on ^/checkout(.*) http://shoppingsite.com/checkout$1 [R] 

Veja a documentação do mod_rewrite .