249 votes

Force SSL/https à l’aide de .htaccess et mod_rewrite

Comment puis-je forcer à SSL/https à l’aide de .htaccess et mod_rewrite page spécifique en PHP.

457voto

Gordon Points 156415

Pour Apache, vous pouvez utiliser mod_ssl de la force de SSL avec l' SSLRequireSSL Directive:

Cette directive interdit l'accès, à moins que le protocole HTTP sur SSL (c'est à dire HTTPS) est activé pour la connexion courante. Ce qui est très pratique à l'intérieur de la SSL, serveur virtuel ou répertoires pour se défendre contre les erreurs de configuration qui exposent les trucs qui doivent être protégés. Lorsque cette directive est présent à toutes les demandes sont refusées qui ne sont pas à l'aide de SSL.

Ce ne sera pas faire une redirection vers https. Pour la redirection, essayez le suivant, mod_rewrite dans votre .fichier htaccess

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

des différentes approches donné à

Vous pouvez également résoudre ce à partir de l'intérieur de PHP dans le cas où votre réseau est désactivé .htaccess (ce qui est peu probable puisque vous l'avez demandé, mais de toute façon)

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();
    }
}

37voto

Lucanos Points 7593

Solution PHP

D'emprunt directement à partir de Gordon est très complète réponse, je remarque que votre question mentionne en cours de page spécifique à forcer le HTTPS/SSL connexions.

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>' );
    }
  }
}

Puis, comme près du haut de ces pages qui vous voulez forcer à se connecter via PHP, vous pouvez require() centralisée fichier contenant ce (et les autres) les fonctions personnalisées, et puis il suffit de lancer l' forceHTTPS() fonction.

HTACCESS / mod_rewrite Solution

Je n'ai pas mis en œuvre une solution de ce genre, personnellement j'ai tendance à utiliser la solution PHP, comme celle-ci, pour sa simplicité), mais peuvent être, au moins, un bon début.

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]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X