Comment puis-je forcer à SSL / https en utilisant la page .htaccess et mod_rewrite spécifique à PHP.
Comment puis-je forcer à SSL / https en utilisant la page .htaccess et mod_rewrite spécifique à PHP.
Réponses:
Pour Apache, vous pouvez utiliser mod_ssl
pour forcer SSL avec SSLRequireSSL Directive
:
Cette directive interdit l'accès à moins que HTTP sur SSL (c'est-à-dire HTTPS) soit activé pour la connexion actuelle. C'est très pratique à l'intérieur de l'hôte virtuel ou des répertoires compatibles SSL pour se défendre contre les erreurs de configuration qui exposent des éléments qui doivent être protégés. Lorsque cette directive est présente, toutes les demandes refusées n'utilisant pas SSL.
Cependant, cela ne fera pas de 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 différentes approches données à
Vous pouvez également résoudre ce problème à partir de PHP au cas où votre fournisseur aurait désactivé .htaccess (ce qui est peu probable depuis que 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();
}
}
%{HTTP:X-Forwarded-Proto}
ou %{HTTP:X-Real-Port}
pour vérifier si SSL est activé.
RewriteRule <input-pattern> <output-url>
. Ainsi, l'espace doit être là, et le single ^
dit simplement "correspondre à toutes les URL d'entrée".
J'ai trouvé une mod_rewrite
solution qui fonctionne bien pour les serveurs proxy et non proxy.
Si vous utilisez CloudFlare, AWS Elastic Load Balancing, Heroku, OpenShift ou toute autre solution Cloud / PaaS et que vous rencontrez des boucles de redirection avec des redirections HTTPS normales, essayez plutôt l'extrait de code suivant.
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]
En empruntant directement à la réponse très complète de Gordon, je note que votre question mentionne être spécifique à la page pour forcer 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 souhaitez forcer à se connecter via PHP, vous pouvez require()
un fichier centralisé contenant cette (et toute autre) fonctions personnalisées, puis exécutez simplement la forceHTTPS()
fonction.
Je n'ai pas implémenté ce type de solution personnellement (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]
RewriteCond %{REQUEST_METHOD} !^POST$
?
RewriteCond %{REQUEST_METHOD} !^POST$
devrait empêcher les soumissions POST d'être affectées par ces redirections.
Solution basée sur la réécriture de modules:
L'utilisation du code suivant dans htaccess transfère 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 demandes non www et www 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 d'apache car la variable% {REQUEST_SCHEME} a été ajoutée à mod-rewrite depuis 2.4.
Je voudrais juste souligner qu'Apache a les pires règles d'héritage lors de l'utilisation de plusieurs fichiers .htaccess à travers les profondeurs de répertoire. Deux pièges clés:
RewriteOptions InheritDownBefore
directive (ou similaire) pour changer cela. (voir question)Cela signifie que la solution globale suggérée sur le wiki Apache ne fonctionne pas si vous utilisez d'autres 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/
Simple et facile, ajoutez simplement le suivant
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Simple:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www\.example\.com)(:80)? [NC]
RewriteRule ^(.*) https://example.com/$1 [R=301,L]
order deny,allow
remplacez votre URL par example.com
pour forcer simplement SSL avec Apache .htaccess, vous pouvez utiliser
SSLOptions +StrictRequire
SSLRequireSSL
pour rediriger la réponse ci-dessus est correcte
essayez ce code, il fonctionnera pour toutes les versions d'URL comme
RewriteCond %{HTTPS} off
RewriteCond %{HTTPS_HOST} !^www.website.com$ [NC]
RewriteRule ^(.*)$ https://www.website.com/$1 [L,R=301]