Article
Fichier .Htaccess Symfony
deveops
2.16min to read
15-01-2024
Fichier .htaccess de base pour une application Symfony 6.4.*
Fichier .htaccess de base pour une application Symfony 6.4.*
Pour qu'une application Symfony fonctionne correctement, vous DEVEZ stocker ce fichier ".htaccess" dans le même répertoire que votre contrôleur frontal,"index.php" soit dans le dossier public de votre application.
# Symfony 6.4. fichier de base pour une redirection correcte
# à placer dans le dossier public avec le front contrôleur index.php
# Utilisez le contrôleur frontal comme fichier d'index.
DirectoryIndex index.php
# Dé-commentez la ligne suivante si vous installez des ressources sous forme de liens symboliques ou si vous
# rencontrez des problèmes liés aux liens symboliques lors de la compilation de LESS/Sass/CoffeScript.
Options +FollowSymLinks
# La désactivation de MultiViews empêche les négociations indésirables, par ex. "/index" ne devrait pas être résolu
# par le contrôleur frontal "/index.php" mais réécrit en "/index.php/index".
<IfModule mod_negociation.c>
Options -Multiviews
</IfModule>
<IfModule mod_rewrite.c>
RewriteEngine On
# Ce RewriteRule est utilisé pour découvrir dynamiquement le chemin RewriteBase.
# Voir https://httpd.apache.org/docs/current/mod/mod_rewrite.html
#rewriterule
# Ici, nous comparerons le chemin d'accès par répertoire supprimé par rapport au système de fichiers chemin
# où le fichier .htaccess est lu avec l'URI de la requête.
#
# Si une correspondance est trouvée, le chemin du préfixe est stocké dans une variable ENV ultérieurement
# utilisé pour préfixer correctement l'URI du contrôleur frontal index.php.
# C'est ce qui permet d'héberger une application Symfony sous un sous-chemin,
# tel que example.com/sousdossier
# La condition de réécriture alambiquée signifie :
# 1. Faites correspondre tous les URI actuels dans RewriteRule et référencez-les en utilisant $0
# 2. Supprimez la requête uri du chemin par répertoire et utilisez ir comme REQUEST_URI.
# Ceci est documenté dans https://bit.ly/3zDm3SI("Qu'est-ce qui correspond ?")
# 3. Évaluez le RewriteCond, en supposant que votre DocumentRoot soit /var/www/html,
# ce .htaccess se trouve dans le répertoire /var/www/html/public et l'URI de votre requête
# est /public/hello/world :
# * Supprimer le préfixe par répertoire : /var/www/html/public/hello/world -> hello/world
# * application du motif '.' à l'uri 'hello/world'
# * RewriteCond : input='/public/hello/world::hello/world' pattern='^(/.+)/(.)::\2$' => correspondant
# 4. Exécutez la RewriteRule :
# * Le %1 dans l'indicateur RewriteRule E=BASE:%1 fait référence au premier groupe capturé dans RewriteCond ^(/.+)/(.*)
# * définition de la variable d'environnement 'BASE' sur '/public'
RewriteCond %{REQUEST_URI}::$0 ^(/.+)/(.)::\2$
RewriteRule . - [E=BASE:%1]
# Définit l'en-tête HTTP_AUTHORIZATION supprimé par Apache
RewriteCond %{HTTP:Authorization} .+
RewriteRule ^ - [E=HTTP_AUTHORIZATION:%0]
#Supprime la partie /index.php/ d'une URL, si elle est présente
RewriteCond %{ENV:REDIRECT_STATUS} =""
RewriteCond %{HTTPS} off
RewriteRule ^index.php(?:/(.*)|$) https://%{ENV:BASE}/$1 [R=301,L]
# Si le nom de fichier demandé existe, servez-le simplement.
# Sinon, réécrivez toutes les autres requêtes sur le contrôleur frontal.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ %{ENV:BASE}/index.php [L]
</IfModule>
<IfModule !mod_rewrite.c>
<IfModule mod_alias.c>
# Lorsque mod_rewrite n'est pas disponible, nous ordonnons une redirection temporaire
# au contrôleur frontal explicitement pour que le site Web
RedirectMatch 307 ^/$ /index.php/
</IfModule>
</IfModule>
Avec ce fichier vous aurez une redirection fonctionnelle et de belle urls !