web-dev-qa-db-fra.com

Forcer HTTPS et WWW avec Apache

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é.

3
itteam

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.

1
plinto

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.

2
MrWhite