Servir une application Laravel avec Apache sur Debian 13
vérifié le 7 septembre 2026 · 4 min
Trois conditions pour servir Laravel avec Apache : DocumentRoot sur le dossier public/, sudo a2enmod rewrite, et AllowOverride All sur ce dossier. Sans cette dernière directive, Apache ignore le .htaccess livré par Laravel : la page d’accueil s’affiche mais toutes les autres routes renvoient 404.
Apache reste le serveur web le plus répandu en hébergement mutualisé et sur les serveurs installés de longue date. Servir une application Laravel derrière Apache demande trois choses : un hôte virtuel dont la racine pointe sur public/, le module de réécriture activé, et AllowOverride All pour que le fichier .htaccess livré par Laravel soit lu.
Ce chapitre s’inscrit dans l’installation de Laravel sur Debian, dans le parcours Développement web. Cet oubli du troisième point est la cause quasi systématique des routes en erreur 404. Étapes vérifiées sur Debian 13 avec Apache 2.4.68 et Laravel 13.30.1.
Installer Apache et le module PHP
sudo apt update
sudo apt install -y apache2 libapache2-mod-php
apache2 -vServer version: Apache/2.4.68 (Debian)Le paquet libapache2-mod-php active PHP dans Apache. Contrôlez-le :
a2query -m | grep phpphp8.4 (enabled by maintainer script)Activez ensuite le module de réécriture, qui n’est pas actif par défaut :
sudo a2enmod rewritePlacer le projet
Créez l’application avec Composer, sous un compte non privilégié :
su - deploy
composer create-project laravel/laravel /home/deploy/app --no-interaction
cd /home/deploy/app
php artisan --version # Laravel Framework 13.30.1Donnez ensuite les droits d’écriture aux trois seuls dossiers qui en ont besoin, database/ compris tant que l’application utilise la base SQLite créée à l’installation :
sudo chown -R deploy:www-data /home/deploy/app/storage /home/deploy/app/bootstrap/cache /home/deploy/app/database
sudo chmod -R 775 /home/deploy/app/storage /home/deploy/app/bootstrap/cache /home/deploy/app/database
sudo chmod o+x /home/deploy # Apache doit pouvoir traverser le dossier personnelCréer l’hôte virtuel
<VirtualHost *:80>
ServerName exemple.com
DocumentRoot /home/deploy/app/public
<Directory /home/deploy/app/public>
AllowOverride All
Require all granted
Options -Indexes +FollowSymLinks
</Directory>
ErrorLog ${APACHE_LOG_DIR}/laravel-error.log
CustomLog ${APACHE_LOG_DIR}/laravel-access.log combined
</VirtualHost>Activez le site, désactivez celui par défaut, contrôlez la syntaxe :
sudo a2ensite laravel
sudo a2dissite 000-default
sudo apache2ctl configtest
sudo systemctl reload apache2Syntax OKAllowOverride All : la ligne qui décide de tout
Laravel livre un fichier public/.htaccess qui redirige toutes les requêtes vers index.php. Apache ne lit ce fichier que si la directive AllowOverride l’y autorise. Sans elle, la page d’accueil s’affiche, mais aucune autre route ne répond.
Le comportement a été mesuré sur la route de santé /up, présente dans toute installation récente :
| Configuration | / | /up |
|---|---|---|
AllowOverride All et rewrite actif | 200 | 200 |
AllowOverride None | 200 | 404 |
C’est le symptôme à reconnaître : l’accueil fonctionne, tout le reste renvoie 404. Le problème n’est ni dans les routes, ni dans le code, mais dans la configuration d’Apache.
Le début du .htaccess livré par Laravel, dont dépend ce mécanisme :
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews -Indexes
</IfModule>
RewriteEngine On
# Handle X-XSRF-Token Header
RewriteCond %{HTTP:x-xsrf-token} .
RewriteRule .* - [E=HTTP_X_XSRF_TOKEN:%{HTTP:X-XSRF-Token}]
# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]Vérifier l’installation
curl -s -o /dev/null -w "accueil : %{http_code}\n" http://127.0.0.1/
curl -s -o /dev/null -w "route : %{http_code}\n" http://127.0.0.1/up
curl -s -o /dev/null -w ".env : %{http_code}\n" http://127.0.0.1/.envaccueil : 200
route : 200
.env : 404Le 404 sur /.env est le résultat attendu : puisque la racine du site est public/, le fichier se trouve en dehors de l’arborescence servie et n’est tout simplement pas atteignable. Si vous obtenez 200, c’est que DocumentRoot pointe sur la racine du projet au lieu de public/, et vos identifiants de base de données sont publiquement lisibles.
Passer en HTTPS
Certbot modifie lui-même l’hôte virtuel et met en place le renouvellement automatique :
sudo apt install -y certbot python3-certbot-apache
sudo certbot --apache -d exemple.comPensez à désactiver le mode débogage et à aligner APP_URL sur l’adresse en HTTPS, sans quoi les liens et les avoirs générés par Laravel continueront de pointer en HTTP :
APP_ENV=production
APP_DEBUG=false
APP_URL=https://exemple.comphp artisan config:cache
php artisan route:cache
php artisan view:cacheApache ou nginx
| Apache | nginx | |
|---|---|---|
| Exécution de PHP | module intégré ou PHP-FPM | PHP-FPM uniquement |
| Configuration par dossier | oui, par .htaccess | non, tout dans la configuration du site |
| Réécriture Laravel | fournie par Laravel | à écrire dans le bloc location |
| Hébergement mutualisé | très répandu | rare |
Le .htaccess est l’avantage décisif d’Apache en hébergement mutualisé : il permet de configurer la réécriture sans accès à la configuration du serveur. Sur une machine que vous administrez, les deux conviennent, et le choix se fait sur ce que vous savez exploiter.
Erreurs fréquentes
chmod o+x /home/deploy, sinon Apache renvoie une erreur de permission.