Apache ne force pas HTTPS dans un sous-dossier d'un dossier, mais fonctionne dans les sous-dossiers de premier niveau.
Voici tous les extraits HTAccess que j'ai essayés:
RewriteCond %{HTTP:CF-Visitor} '"scheme":"http"'
RewriteRule ^ https://%{HTTP_Host}%{REQUEST_URI} [R=302,L]
RewriteCond %{HTTP_Host} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_Host}/$1 [R=302,L]
RewriteCond %{SERVER_PORT} !=443 [OR]
RewriteCond %{HTTP_Host} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_Host/$1 [R=302,L]
RewriteCond %{HTTPS} off
RewriteRule .* https://%{HTTP_Host}%{REQUEST_URI} [L,R=302]
RewriteCond %{HTTP_Host} !^www\.
RewriteRule .* https://www.%{HTTP_Host}%{REQUEST_URI} [L,R=302]
J'espère que quelqu'un a la réponse
Edit: Après avoir joué un peu plus avec elle, j'ai trouvé une partie du problème.
Par exemple, dans l'un des sous-répertoires de l'un des sous-dossiers directement sous la racine du site, dans le fichier HTAccess, j'avais ce code
RewriteRule ^jquery_autocomplete.html$ jquery_autocomplete.php [L]
Dès que j'ajoute cette ligne, pour quelque raison que ce soit, elle cesse de forcer HTTPS dans ce sous-répertoire, mais dès que je la supprime à nouveau, HTTPS est forcé.
Vous voudrez peut-être envisager de ne pas utiliser .htaccess. Cela aidera à la performance et évitera que d’autres fichiers .htaccess écrasent votre conf. Dans votre fichier principal .conf Apache, vous pouvez ajouter:
<Directory "YOUR WEB DIRECTORY">
AllowOverride None
.....
RewriteCond %{HTTPS} off
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^ https://www.example.com%{REQUEST_URI} [L,R=301]
....
</Directory>
S'il s'agit d'un changement permanent, utiliser 301 au lieu de 302 est préférable, 302 est temporaire.
dans l'un des sous-répertoires de l'un des sous-dossiers directement sous la racine du site, dans le fichier HTAccess, j'avais ce code
Et c'est le problème. Par défaut, mod_rewrite n'hérite pas des directives des dossiers parents. Ainsi, les directives mod_rewrite du sous-dossier remplacent complètement les directives des dossiers parents (les directives qui canonisent l'URL). En fait, il suffit d'activer la variable RewriteEngine
dans le sous-dossier pour bloquer les directives parent.
Dans le fichier .htaccess du sous-répertoire, vous pouvez essayer d'ajouter ce qui suit:
RewriteOptions Inherit
Cependant, notez que les directives mod_rewrite du fichier .htaccess parent sont appliquées après les directives du sous-dossier. (En outre, les directives héritées sont "pratiquement copiées" dans le fichier .htaccess du sous-dossier - elles risquent donc de ne pas se comporter exactement comme prévu.)
Si vous utilisez Apache 2.4+, vous disposez d'options supplémentaires. Par exemple, vous pouvez spécifier les éléments suivants dans le fichier .htaccess dans la racine du document pour hériter des directives parent de tous les sous-dossiers . Fichiers .htaccess et les directives parentes sont d'abord exécutées.
RewriteOptions InheritDownBefore
Référence:
http://httpd.Apache.org/docs/current/mod/mod_rewrite.html#rewriteoptions
Pour forcer HTTPS et www
dans une règle , vous pouvez faire quelque chose comme:
RewriteCond %{HTTPS} !on [OR]
RewriteCond %{HTTP_Host} !^www\.
RewriteRule (.*) https://www.example.com/$1 [R=302,L]
Semblable à ce que vous aviez déjà, mais vous ne pouvez pas utiliser %{HTTP_Host
dans la substitution (vous omettez d'ailleurs l'accolade fermante), car celle-ci peut contenir ou non déjà le sous-domaine www.
. (Vous pourrez peut-être utiliser %{SERVER_NAME}
mais cela dépend du serveur.)
La redirection 302
(temporaire) est utile pour les tests, mais remplacez-la par 301
lorsque vous êtes satisfait que tout fonctionne correctement.
Pour avoir deux règles distinctes, utilisez votre troisième bloc de code.