Forcer SSL / https en utilisant.htaccess et mod rewrite

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

206
demandé sur lpd 2010-12-09 16:56:28

10 réponses

pour Apache, vous pouvez utiliser mod_ssl pour forcer SSL avec le SSLRequireSSL Directive :

cette directive interdit L'accès à moins que HTTP over SSL (i.e. HTTPS) ne soit activé pour la connexion actuelle. C'est très pratique à l'intérieur de L'hôte ou des répertoires virtuels compatibles SSL pour se défendre contre les erreurs de configuration qui exposent des choses qui devraient être protégées. Lorsque cette directive est présente, toutes les requêtes sont nié qui n'utilisent pas SSL.

cela ne fera pas une redirection vers https. Pour rediriger, essayez ce qui suit avec mod_rewrite dans votre .fichier htaccess

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

ou l'une des diverses approches données à

vous pouvez résolvez également cela à partir de PHP dans le cas où votre fournisseur a 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();
    }
}
392
répondu Gordon 2014-05-13 16:12:18

j'ai trouvé une solution mod_rewrite qui fonctionne bien pour les serveurs mandataires et non mandataires.

si vous utilisez CloudFlare, AWS Elastic Load Balancing, Heroku, OpenShift ou toute autre solution Cloud/PaaS et que vous rencontrez redirect loops avec des redirections HTTPS normales, essayez l'extrait suivant à la place.

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
répondu raphinesse 2018-03-20 11:46:10

PHP Solution

empruntant directement à la réponse très complète de Gordon, je note que votre question mentionne être propre à une page en forçant les connexions 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>' );
    }
  }
}

ensuite, aussi près du haut de ces pages que vous voulez forcer à se connecter via PHP, vous pouvez require() un fichier centralisé contenant cette (et d'autres) fonctions personnalisées, et ensuite simplement exécuter la fonction forceHTTPS() .

Htaccess / mod_rewrite Solution

Je n'ai pas personnellement mis en œuvre ce type de solution (j'ai eu tendance à utiliser la solution PHP, comme celle ci-dessus, pour sa simplicité), mais ce qui suit peut ê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]
34
répondu Luke Stevenson 2010-12-09 16:04:09

Mod-rewrite base de solution :

en utilisant le code suivant dans htaccess transmet automatiquement toutes les requêtes http à https.

RewriteEngine on

RewriteCond %{HTTPS}::%{HTTP_HOST} ^off::(?:www\.)?(.+)$
RewriteRule ^ https://www.%1%{REQUEST_URI} [NE,L,R]

cela redirigera vos non-www et www requêtes http vers www version de https.

une autre solution (Apache 2.4*)

RewriteEngine on

RewriteCond %{REQUEST_SCHEME}::%{HTTP_HOST} ^http::(?:www\.)?(.+)$
RewriteRule ^ https://www.%1%{REQUEST_URI} [NE,L,R]

cela ne fonctionne pas sur les versions inférieures de la variable apache as %{REQUEST_SCHEME} a été ajoutée à mod-rewrite depuis 2.4.

7
répondu starkeen 2017-04-12 07:54:03

Je voudrais juste souligner Qu'Apache a le pire règles d'héritage lors de l'utilisation multiple .fichiers htaccess à travers les profondeurs des répertoires. Deux écueils:

  • seules les règles contenues dans le plus profond .fichier htaccess sera effectué par défaut. Vous devez spécifier la directive RewriteOptions InheritDownBefore (ou similaire) pour changer cela. (voir question)
  • le modèle est appliqué au chemin du fichier par rapport au sous-répertoire et non au répertoire supérieur contenant le .fichier htaccess avec la règle donnée. (voir discussion)

cela signifie la solution globale suggérée sur le Apache Wiki does et non travail si vous utilisez un autre .fichiers htaccess dans les sous-répertoires. J'ai écrit une version modifiée qui fait:

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
répondu lpd 2017-05-23 12:02:58

ce code fonctionne pour moi

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP:X-HTTPS} !1
RewriteRule ^(.*)$ https://%{HTTP_HOST}/ [R=301,L]
0
répondu Alexufo 2017-01-11 15:18:52

Simple:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www\.example\.com)(:80)? [NC]
RewriteRule ^(.*) https://example.com/ [R=301,L]
order deny,allow

remplacer votre url par example.com

0
répondu Sepehr Norouzi 2017-01-28 10:45:29

pour avoir forcé SSL avec Apache .htaccess vous pouvez utiliser

SSLOptions +StrictRequire
SSLRequireSSL

pour rediriger la réponse ci-dessus est correct

0
répondu webdesignwien 2017-06-17 11:15:07

essayez ce code, il fonctionnera pour toutes les versions D'URLs comme

0
répondu Kashif Latif 2017-09-13 09:44:04

Simple et facile, il suffit d'ajouter la suite

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