Forçar o SSL/https a usar.htaccess e MOD reescrever
Como posso forçar o SSL / https a usar .htaccess and mod_rewrite page specific in PHP.
10 answers
Para o Apache, você pode usar mod_ssl
para forçar SSL com o SSLRequireSSL Directive
:
Isto não vai fazer um redireccionamento. mas aos https. Para redireccionar, tente o seguinte comA presente directiva proíbe o acesso a menos que o HTTP sobre SSL (isto é, HTTPS) esteja activo para a ligação actual. Isto é muito útil dentro da máquina virtual ou pastas activadas pelo SSL para defender contra erros de configuração que expõem as coisas que devem ser protegidas. Quando esta directiva está presente, todos os pedidos são negados que não utilizam SSL.
mod_rewrite
no teu .ficheiro htaccess
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Ou qualquer uma das várias abordagens dadas em
Também pode resolver isto a partir do PHP no caso do seu fornecedor ter desactivado .htaccess (o que é improvável uma vez que você pediu, mas de qualquer forma)
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();
}
}
Encontrei uma solução mod_rewrite
que funciona bem para servidores proxies e não proxies.
Se estiver a utilizar CloudFlare, AWS Elastic Load balanceamento, Heroku, OpenShift ou qualquer outra solução de Cloud/PaaS e estiver a experimentar redireccionar os loops com os repetições normais dos HTTPS, tente o seguinte excerto em vez disso.
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]
Solução de PHP
Tomando emprestado directamente da resposta muito abrangente do Gordon, constato que a sua pergunta menciona ser específica de página ao forçar ligaçõ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 destas páginas que você quer forçar a ligar através do PHP, você pode require()
um ficheiro centralizado que contém esta (e qualquer outra) funções personalizadas, e então simplesmente executar a função forceHTTPS()
.
HTACCESS / mod_ reescrever a Solução
Eu não implementei este tipo de coisas. de solução pessoalmente (eu tendi a usar a solução PHP, como a acima, por ser simples), 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]
Solução baseada em Mod-reescrita:
Usando o seguinte código no htaccess encaminha automaticamente todos os pedidos http para https.
RewriteEngine on
RewriteCond %{HTTPS}::%{HTTP_HOST} ^off::(?:www\.)?(.+)$
RewriteRule ^ https://www.%1%{REQUEST_URI} [NE,L,R]
Isto irá redireccionar o seu non-www e www pedidos http para www versão dos 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]
Isto não funciona em versões mais baixas do apache, dado que a variável %{REQUEST_ scheme} foi adicionada ao mod-reescrita desde o ponto 2.4.
Gostaria apenas de salientar que o Apache tem as piores regras de herança quando usa múltiplas .ficheiros htaccess nas profundezas dos directórios. Duas armadilhas principais:
- Apenas as regras contidas no mais profundo .o arquivo htaccess será executado por padrão. Deve especificar a Directiva
- o padrão é aplicado à localização do ficheiro em relação à sub-pasta e não à pasta superior que contém a pasta .ficheiro htaccess com a regra indicada. (ver discussão)
RewriteOptions InheritDownBefore
(ou semelhante) para alterar esta situação. (ver pergunta)
Isto significa que a solução global sugerida no Apache Wiki não funciona se usar qualquer outro .ficheiros htaccess nas sub-pastas. 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/
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP:X-HTTPS} !1
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
Um simples:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www\.example\.com)(:80)? [NC]
RewriteRule ^(.*) https://example.com/$1 [R=301,L]
order deny,allow
Substitua o seu url por example.com
SSLOptions +StrictRequire
SSLRequireSSL
Para redireccionar a resposta acima está correcta
Tente este código, ele vai funcionar para todas as versões de URLs como
- website.com
- www.website.com
- http://website.com
-
RewriteCond %{HTTPS} off RewriteCond %{HTTPS_HOST} !^www.website.com$ [NC] RewriteRule ^(.*)$ https://www.website.com/$1 [L,R=301]
Simples e fácil , basta adicionar
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]