Chapitre 4 sur 5

Servir une application Laravel avec Apache sur Debian 13

vérifié le 7 septembre 2026 · 4 min

Réponse rapide

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

bash
sudo apt update
sudo apt install -y apache2 libapache2-mod-php
apache2 -v
code
Server version: Apache/2.4.68 (Debian)

Le paquet libapache2-mod-php active PHP dans Apache. Contrôlez-le :

bash
a2query -m | grep php
code
php8.4 (enabled by maintainer script)

Activez ensuite le module de réécriture, qui n’est pas actif par défaut :

bash
sudo a2enmod rewrite

Placer le projet

Créez l’application avec Composer, sous un compte non privilégié :

bash
su - deploy
composer create-project laravel/laravel /home/deploy/app --no-interaction
cd /home/deploy/app
php artisan --version   # Laravel Framework 13.30.1

Donnez 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 :

bash
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 personnel

Créer l’hôte virtuel

/etc/apache2/sites-available/laravel.conf
<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 :

bash
sudo a2ensite laravel
sudo a2dissite 000-default
sudo apache2ctl configtest
sudo systemctl reload apache2
code
Syntax OK

AllowOverride 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 :

public/.htaccess
<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

bash
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/.env
code
accueil : 200
route   : 200
.env    : 404

Le 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 :

bash
sudo apt install -y certbot python3-certbot-apache
sudo certbot --apache -d exemple.com

Pensez à 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 :

.env
APP_ENV=production
APP_DEBUG=false
APP_URL=https://exemple.com
bash
php artisan config:cache
php artisan route:cache
php artisan view:cache

Apache 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

AllowOverride absent ou à None Apache ignore le .htaccess de Laravel. L’accueil répond, toutes les autres routes renvoient 404. Symptôme mesuré sur la route /up.
Oublier a2enmod rewrite Le module de réécriture n’est pas actif par défaut sur Debian. Même effet que ci-dessus.
DocumentRoot sur la racine du projet Le fichier .env devient téléchargeable. Il doit renvoyer 404, ce qui prouve que la racine est bien public/.
Dossier personnel non traversable Un projet dans /home/deploy exige chmod o+x /home/deploy, sinon Apache renvoie une erreur de permission.
APP_URL resté en HTTP après Certbot Les liens et avoirs générés par Laravel continuent de pointer en HTTP.
Newsletter

Les nouveaux tests, tutoriels et projets, par e-mail.

Tests reproductibles, code versionné, résultats datés. Jamais de spam.