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.
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();
}
}
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]
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]
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.
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/
ce code fonctionne pour moi
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP:X-HTTPS} !1
RewriteRule ^(.*)$ https://%{HTTP_HOST}/ [R=301,L]
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
pour avoir forcé SSL avec Apache .htaccess vous pouvez utiliser
SSLOptions +StrictRequire
SSLRequireSSL
pour rediriger la réponse ci-dessus est correct
essayez ce code, il fonctionnera pour toutes les versions D'URLs comme
- website.com
- www.website.com
- http://website.com
-
RewriteCond %{HTTPS} off RewriteCond %{HTTPS_HOST} !^www.website.com$ [NC] RewriteRule ^(.*)$ https://www.website.com/ [L,R=301]
Simple et facile, il suffit d'ajouter la suite
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]