10 — Configuration serveur : .htaccess (Apache)
Définition
Le fichier .htaccess est un fichier de configuration Apache qui permet de définir des règles de réécriture d’URL au niveau d’un répertoire. Dans notre architecture, il sert à rediriger toutes les requêtes vers public/index.php.
🔗 Comparaison Laravel
Laravel est livré avec un fichier public/.htaccess quasi identique au nôtre.
Notre public/.htaccess :
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{DOCUMENT_ROOT}/../%{REQUEST_URI} -f
RewriteRule ^(.*)$ /../$1 [L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>
.htaccess de Laravel :
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>
Notre version ajoute la gestion des fichiers statiques hors de public/.
Prérequis Apache
Le module mod_rewrite doit être activé :
sudo a2enmod rewrite
sudo systemctl restart apache2
Et dans la configuration du VirtualHost Apache :
<Directory /var/www/html/php-blog-2026/public>
AllowOverride All # Permet la lecture du .htaccess
</Directory>
Analyse règle par règle
RewriteEngine On
Active le moteur de réécriture d’URL pour ce répertoire.
Règle 1 : Servir les fichiers statiques hors de public/
RewriteCond %{DOCUMENT_ROOT}/../%{REQUEST_URI} -f
RewriteRule ^(.*)$ /../$1 [L]
RewriteCond : condition à respecter avant d’appliquer la règle.
%{DOCUMENT_ROOT}: le chemin absolu du dossierpublic/sur le disque./../: on remonte d’un niveau vers la racine du projet.%{REQUEST_URI}: l’URL demandée, ex:/resources/css/blog.css.-f: vérifie que le chemin assemblé est un fichier existant.
RewriteRule : si la condition est vraie, réécris l’URL.
^(.*)$: capture toute l’URL./../$1: redirige vers le fichier un niveau au-dessus depublic/.[L]: “Last” — arrête le traitement des règles si celle-ci correspond.
Règle 2 : Tout rediriger vers index.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
Condition 1 : !-d — Le chemin demandé n’est PAS un répertoire existant dans public/.
Condition 2 : !-f — Le chemin demandé n’est PAS un fichier existant dans public/.
Si les deux conditions sont vraies (ni dossier, ni fichier), on redirige vers index.php qui lancera le routeur.
Flux complet d’une requête avec Apache
Navigateur → GET /login.php
↓
Apache + .htaccess
↓
public/login.php existe ? NON
public/ est un dossier ? NON
↓
Réécriture → public/index.php
↓
PHP - session_start()
↓
Router::resolve('/login.php')
↓
AuthController::login()
↓
HTML affiché
Comparaison : Apache vs Serveur intégré PHP
| Serveur intégré PHP | Apache | |
|---|---|---|
| Fichier de config | server.php |
.htaccess |
| Commande | php -S localhost:8000 server.php |
Configuration VirtualHost |
| Usage | Développement uniquement | Développement et Production |
| Performance | Faible | Haute |
Configuration Nginx (alternative à Apache)
Si vous utilisez Nginx au lieu d’Apache, voici la configuration équivalente :
server {
listen 80;
root /var/www/html/php-blog-2026/public;
index index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# Servir les fichiers statiques hors de public
location ~* \.(css|js|jpg|png|gif|webp)$ {
root /var/www/html/php-blog-2026;
try_files $uri =404;
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.4-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
}
C’est exactement la configuration que Forge (l’outil de déploiement de Laravel) génère automatiquement pour les projets Laravel sur Nginx.
Prêt à passer à la suite ?
Vous avez terminé cette leçon sur 10 — Configuration serveur : `.htaccess` (Apache). Continuez votre apprentissage avec la prochaine leçon ou explorez d'autres formations.