J’essaie de configurer un site fonctionnant sur Apache 2.4.16 pour redirect toutes les URL www vers des URL non-www. J’utilise les configurations Apache de HTML5 Boilerplate pour cela (ainsi que tout ce qu’elles fournissent).
https://github.com/h5bp/server-configs-apache/blob/master/dist/.htaccess
Cela se produit à la ligne 380, vue ci-dessous:
RewriteEngine On RewriteCond %{HTTPS} !=on RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC] RewriteRule ^ %{ENV:PROTO}://%1%{REQUEST_URI} [R=301,L]
J’utilise Include
pour append le fichier entier à ma config vhost pour le site, ainsi qu’un AllowOverride All
pour un autre fichier .htaccess
à ma racine doc (identique à celui fourni avec Laravel 5):
production.vhost.conf (partie pertinente)
AllowOverride All # Include H5BP server configs Include server-configs-apache/dist/.htaccess
.htaccess (à la racine de la doc)
Options -MultiViews RewriteEngine On # Redirect Trailing Slashes If Not A Folder... RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)/$ /$1 [L,R=301] # Handle Front Controller... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L]
Maintenant, presque tout de .htaccess
de H5BP fonctionnait, à l’exception de la redirection de www à non-www. Après avoir fouillé, j’ai remarqué que la redirection ne fonctionnait que lorsque je AllowOverride All
du bloc dans le vhost. Ainsi, la racine de doc
.htaccess
était en quelque sorte surpassant les conditions de réécriture.
J’ai déjà corrigé mon problème initial en déplaçant le contenu .htaccess
racine de la doc dans le fichier vhost et en supprimant AllowOverride, mais je suis plus curieux de savoir pourquoi cela se produisait; Plus spécifiquement, la façon dont AllowOverride interagit avec RewriteCond et RewriteRule.
Mon intuition est que le .htaccess
de mon répertoire racine a été remplacé par le redirection www vers non-www, mais je ne sais pas trop pourquoi. Par exemple, la redirection http -> https fonctionnait sans problème (ligne 352 de H5BP, non commentée dans la mienne), elle semblait être celle que vous redirigiez. Je ne pensais même pas que ces règles pourraient être remplacées puisque RewriteCond / RewriteRules me semble unique.
S’il y en a, quelles sont les règles qui déterminent comment un .htaccess
peut remplacer une règle de réécriture?
S’il y en a, quelles sont les règles qui déterminent comment un fichier .htaccess peut remplacer une règle de réécriture?
Les conditions et les règles ne dictent pas le fonctionnement de .htaccess. AllowOverride
est ce qui permet l’utilisation de .htaccess. Si vous avez AllowOverride All
alors .htaccess est autorisé, si vous avez AllowOverride None
, alors ce n’est pas le cas et il sera ignoré. Dans 2.4 None
n’est la valeur par défaut.
.htaccess est par répertoire, il aura donc la priorité s’il se trouve dans un répertoire dont les règles sont appliquées tant que l’utilisation du fichier .htaccess y est autorisée. Qui est configuré dans la configuration du serveur dans les directives VirtualHost
ou Directory
.
Utiliser également un include pour .htaccess dans un vhost est une très mauvaise configuration. Si vous avez access au fichier vhost ou à la configuration, vous devez créer une autre configuration et l’inclure avec le contenu .htaccess.
Vous ne devriez pas utiliser de fichiers .htaccess avec l’access à la configuration du serveur. Voir cette recommandation Apache sur ne pas utiliser .htaccess. https://httpd.apache.org/docs/2.4/howto/htaccess.html#when