Como forçar o SSL / https usando a página .htaccess e mod_rewrite específica no PHP.
Como forçar o SSL / https usando a página .htaccess e mod_rewrite específica no PHP.
Respostas:
Para o Apache, você pode usar mod_ssl
para forçar o SSL com o SSLRequireSSL Directive
:
Esta diretiva proíbe o acesso, a menos que o HTTP sobre SSL (ou seja, HTTPS) esteja ativado para a conexão atual. Isso é muito útil dentro do host ou diretórios virtuais habilitados para SSL para se defender contra erros de configuração que expõem coisas que devem ser protegidas. Quando esta diretiva está presente, todos os pedidos são negados e não estão usando SSL.
Isso não fará um redirecionamento para https. Para redirecionar, tente o seguinte com mod_rewrite
no seu arquivo .htaccess
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
ou qualquer uma das várias abordagens dadas em
Você também pode resolver isso a partir do PHP, caso seu provedor tenha desabilitado o .htaccess (o que é improvável desde que você solicitou, mas mesmo assim)
if (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] !== 'on') {
if(!headers_sent()) {
header("Status: 301 Moved Permanently");
header(sprintf(
'Location: https://%s%s',
$_SERVER['HTTP_HOST'],
$_SERVER['REQUEST_URI']
));
exit();
}
}
%{HTTP:X-Forwarded-Proto}
ou %{HTTP:X-Real-Port}
variáveis para verificar se o SSL está ligado.
RewriteRule <input-pattern> <output-url>
. Assim, o espaço precisa estar lá, e o single ^
diz apenas "corresponder a todos os URLs de entrada".
Encontrei uma mod_rewrite
solução que funciona bem para servidores com e sem proxy.
Se você estiver usando CloudFlare, AWS Elastic Load Balancing, Heroku, OpenShift ou qualquer outra solução Cloud / PaaS e estiver enfrentando loops de redirecionamento com redirecionamentos HTTPS normais, tente o seguinte snippet.
RewriteEngine On
# If we receive a forwarded http request from a proxy...
RewriteCond %{HTTP:X-Forwarded-Proto} =http [OR]
# ...or just a plain old http request directly from the client
RewriteCond %{HTTP:X-Forwarded-Proto} =""
RewriteCond %{HTTPS} !=on
# Redirect to https version
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Tomando emprestado diretamente da resposta muito abrangente de Gordon, notei que sua pergunta menciona ser específico da página para forçar conexões HTTPS / SSL.
function forceHTTPS(){
$httpsURL = 'https://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
if( count( $_POST )>0 )
die( 'Page should be accessed with HTTPS, but a POST Submission has been sent here. Adjust the form to point to '.$httpsURL );
if( !isset( $_SERVER['HTTPS'] ) || $_SERVER['HTTPS']!=='on' ){
if( !headers_sent() ){
header( "Status: 301 Moved Permanently" );
header( "Location: $httpsURL" );
exit();
}else{
die( '<script type="javascript">document.location.href="'.$httpsURL.'";</script>' );
}
}
}
Então, tão perto do topo dessas páginas que você deseja forçar a conexão via PHP, você pode require()
um arquivo centralizado contendo essas (e quaisquer outras) funções personalizadas e simplesmente executar a forceHTTPS()
função.
Eu não implementei esse tipo de solução pessoalmente (eu costumava usar a solução PHP, como a acima, por sua simplicidade), mas o seguinte pode ser, pelo menos, um bom começo.
RewriteEngine on
# Check for POST Submission
RewriteCond %{REQUEST_METHOD} !^POST$
# Forcing HTTPS
RewriteCond %{HTTPS} !=on [OR]
RewriteCond %{SERVER_PORT} 80
# Pages to Apply
RewriteCond %{REQUEST_URI} ^something_secure [OR]
RewriteCond %{REQUEST_URI} ^something_else_secure
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
# Forcing HTTP
RewriteCond %{HTTPS} =on [OR]
RewriteCond %{SERVER_PORT} 443
# Pages to Apply
RewriteCond %{REQUEST_URI} ^something_public [OR]
RewriteCond %{REQUEST_URI} ^something_else_public
RewriteRule .* http://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
RewriteCond %{REQUEST_METHOD} !^POST$
?
RewriteCond %{REQUEST_METHOD} !^POST$
deve impedir que os envios POST sejam afetados por esses redirecionamentos.
Solução baseada em modificação de reescrita:
O uso do código a seguir no htaccess encaminha automaticamente todas as solicitações http para https.
RewriteEngine on
RewriteCond %{HTTPS}::%{HTTP_HOST} ^off::(?:www\.)?(.+)$
RewriteRule ^ https://www.%1%{REQUEST_URI} [NE,L,R]
Isso redirecionará suas solicitações http não www e www para a versão www de https.
Outra solução (Apache 2.4 *)
RewriteEngine on
RewriteCond %{REQUEST_SCHEME}::%{HTTP_HOST} ^http::(?:www\.)?(.+)$
RewriteRule ^ https://www.%1%{REQUEST_URI} [NE,L,R]
Isso não funciona nas versões inferiores do apache, pois a variável% {REQUEST_SCHEME} foi adicionada ao mod-rewrite desde o 2.4.
Gostaria apenas de salientar que o Apache tem as piores regras de herança ao usar vários arquivos .htaccess nas profundezas do diretório. Duas armadilhas principais:
RewriteOptions InheritDownBefore
diretiva (ou similar) para alterar isso. (ver pergunta)Isto significa que a solução global sugerida no Apache Wiki se não funcionar se você usar quaisquer outros arquivos .htaccess em subdiretórios. Eu escrevi uma versão modificada que faz:
RewriteEngine On
# This will enable the Rewrite capabilities
RewriteOptions InheritDownBefore
# This prevents the rule from being overrided by .htaccess files in subdirectories.
RewriteCond %{HTTPS} !=on
# This checks to make sure the connection is not already HTTPS
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [QSA,R,L]
# This rule will redirect users from their original location, to the same location but using HTTPS.
# i.e. http://www.example.com/foo/ to https://www.example.com/foo/
Simples e fácil, basta adicionar o seguinte
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Simples:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www\.example\.com)(:80)? [NC]
RewriteRule ^(.*) https://example.com/$1 [R=301,L]
order deny,allow
substitua seu URL por example.com
por apenas forçar o SSL com o Apache .htaccess, você pode usar
SSLOptions +StrictRequire
SSLRequireSSL
para redirecionar a resposta acima está correta
tente esse código, ele funcionará para todas as versões de URLs, como
RewriteCond %{HTTPS} off
RewriteCond %{HTTPS_HOST} !^www.website.com$ [NC]
RewriteRule ^(.*)$ https://www.website.com/$1 [L,R=301]