Digamos que você queira que http://www.examplo.com/seguro/ sempre seja enviado por SSL(presumo aqui que tanto o vhost normal quanto o SSL têm o mesmo conteúdo).
Obs.: SSL é um termo muito empregado ainda, mas é um protocolo antiquado, o novo protocolo é o tls.
Para isso temos 3 soluções:
- usando vhost ou virtualhost
- usando .htaccess
- usando mod_rewarite
Redirecionando com Virtual Hosts
Ao usar SSL, você frequentemente terá pelo menos dois hosts virtuais: um na porta 80 para atender a solicitações comuns e outro na porta 443 para atender SSL. Se você deseja redirecionar usuários do site não seguro para o site SSL, você pode usar uma diretiva Redirect comum dentro do VirtualHost não seguro:
Abaixo redirecionamos(redirect) o site dentro da pasta /seguro para https://meusite.examplo.com/seguro:
NameVirtualHost *:80 <VirtualHost *:80> ServerName meusite.examplo.com DocumentRoot /usr/local/apache2/htdocs Redirect /seguro https://meusite.examplo.com/seguro </VirtualHost> <VirtualHost _default_:443> ServerName meusite.examplo.com DocumentRoot /usr/local/apache2/htdocs SSLEngine On # etc... </VirtualHost>
Ao redirecionar tudo, você nem precisa de um DocumentRoot:
NameVirtualHost *:80 <VirtualHost *:80> ServerName www.exemplo.com Redirect / https://seguro.exemplo.com/ </VirtualHost> <VirtualHost _default_:443> ServerName seguro.exemplo.com DocumentRoot /usr/local/apache2/htdocs SSLEngine On # etc... </VirtualHost>
Assim que a configuração estiver funcionando conforme o esperado, um redirecionamento permanente pode ser considerado. Isso evita problemas de cache na maioria dos navegadores durante o teste. A diretiva passaria a ser:
Redirect permanent / https://secure.example.com/
Redirecionando com htaccess
O redirecionamento também pode ser usado dentro de arquivos .htaccess ou para endereçar URLs específicos, como em:
Redirect /login https://mysite.example.com/login
Redirecionando com mod_rewrite
Embora a solução <VirtualHost> seja recomendada por ser mais simples e segura, você também pode usar mod_rewrite para obter o mesmo efeito. Sim, Usar mod_rewrite para fazer isso não é o comportamento recomendado. Use virtualhost, conforme explicamos acima.
Você deseja forçar as pessoas que acessam seu site a usar HTTPS. Tanto para o site inteiro quanto para uma pequena subseção dele.
RewriteEngine On
# Isso ativará os recursos de regravação
RewriteCond %{HTTPS} !=on
# Isso verifica se a conexão já não é HTTPS
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
# Esta regra redirecionará os usuários de seu local original para o mesmo local, mas usando HTTPS >
# exemplo http://www.examplo.com/foo/ para https://www.examplo.com/foo/
# A barra inicial é opcional para que funcione em httpd.conf
# ou .htaccess
Embora as regras necessárias sejam as mesmas acima (porque a regra acima não depende de nenhuma das peculiaridades de reescrita em .htaccess), você precisará garantir que colocou isso em um arquivo .htaccess na raiz do site no qual você deseja aplicá-lo e certifique-se de ter a configuração AllowOverride apropriada em seu httpd.conf
Diretório especçifico
Coloque a solução acima em um arquivo .htaccess no diretório a ser afetado ou coloque o prefixo URI no próprio regex.
RewriteEngine On
# Isso ativará os recursos de regravação
RewriteCond %{HTTPS} !=on
# Isso verifica se a conexão já não é HTTPS
RewriteRule ^/?secure/(.*) https://%{SERVER_NAME}/secure/$1 [R,L]
# Esta regra redirecionará todos os usuários que estiverem usando qualquer parte de /seguro/ para o mesmo local, mas usando https >
# exemplo http://www.examplo.com/secure/ para https://www.examplo.com/seguro/