Interactions avec AllowOverride et RewriteCond / RewriteRule

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