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.

Author: lpd, 2010-12-09

10 answers

Para o Apache, você pode usar mod_ssl para forçar SSL com o SSLRequireSSL Directive:

A 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.

Isto não vai fazer um redireccionamento. mas aos https. Para redireccionar, tente o seguinte com 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();
    }
}
 392
Author: Gordon, 2014-05-13 16:12:18

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]
 42
Author: raphinesse, 2018-03-20 11:46:10

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]
 34
Author: Luke Stevenson, 2010-12-09 16:04:09

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.

 7
Author: starkeen, 2017-04-12 07:54:03

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 RewriteOptions InheritDownBefore (ou semelhante) para alterar esta situação. (ver pergunta)
  • 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)

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/
 6
Author: lpd, 2017-05-23 12:02:58
Este código funciona para mim.
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP:X-HTTPS} !1
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
 0
Author: Alexufo, 2017-01-11 15:18:52

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

 0
Author: Sepehr Norouzi, 2017-01-28 10:45:29
Por forçar o SSL com o Apache .htaccess pode usar
SSLOptions +StrictRequire
SSLRequireSSL

Para redireccionar a resposta acima está correcta

 0
Author: webdesignwien, 2017-06-17 11:15:07

Tente este código, ele vai funcionar para todas as versões de URLs como

  • website.com
  • www.website.com
  • http://website.com
  • Http://www.website.com

    RewriteCond %{HTTPS} off
    RewriteCond %{HTTPS_HOST} !^www.website.com$ [NC]
    RewriteRule ^(.*)$ https://www.website.com/$1 [L,R=301]
    
 0
Author: Kashif Latif, 2017-09-13 09:44:04

Simples e fácil , basta adicionar

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
 0
Author: Saurabh Mistry, 2018-07-20 12:02:51