Laravel-applicatie serveren met Apache op Debian 13
geverifieerd op 7 september 2026 · 4 min
Drie voorwaarden om Laravel met Apache te serveren: DocumentRoot op de map public/, sudo a2enmod rewrite, en AllowOverride All op die map. Zonder die laatste richtlijn negeert Apache de .htaccess die Laravel meelevert: de startpagina verschijnt, maar elke andere route geeft 404 terug.
Apache is nog altijd de meest gebruikte webserver op shared hosting en op servers die al jaren draaien. Een Laravel-applicatie achter Apache serveren vraagt drie dingen: een virtual host waarvan de documentroot naar public/ wijst, de rewrite-module ingeschakeld, en AllowOverride All zodat het .htaccess-bestand dat Laravel meelevert ook echt gelezen wordt.
Dit hoofdstuk hoort bij Laravel installeren op een Debian-server, onderdeel van het traject Webontwikkeling. Dat derde punt vergeten is vrijwel altijd de reden dat routes een 404 teruggeven. Stappen gecontroleerd op Debian 13 met Apache 2.4.68 en Laravel 13.30.1.
Apache en de PHP-module installeren
sudo apt update
sudo apt install -y apache2 libapache2-mod-php
apache2 -vServer version: Apache/2.4.68 (Debian)Het pakket libapache2-mod-php schakelt PHP in Apache in. Controleer dat:
a2query -m | grep phpphp8.4 (enabled by maintainer script)Zet daarna de rewrite-module aan, die standaard niet actief is:
sudo a2enmod rewriteHet project neerzetten
Maak de applicatie aan met Composer, onder een account zonder rootrechten:
su - deploy
composer create-project laravel/laravel /home/deploy/app --no-interaction
cd /home/deploy/app
php artisan --version # Laravel Framework 13.30.1Geef vervolgens schrijfrechten aan de enige drie mappen die ze nodig hebben, inclusief database/ zolang de applicatie de bij de installatie aangemaakte SQLite-database gebruikt:
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 moet de persoonlijke map kunnen doorlopenDe virtual host aanmaken
<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>Zet de site aan, zet de standaardsite uit en controleer de syntaxis:
sudo a2ensite laravel
sudo a2dissite 000-default
sudo apache2ctl configtest
sudo systemctl reload apache2Syntax OKAllowOverride All: de regel die alles bepaalt
Laravel levert een bestand public/.htaccess mee dat elke aanvraag naar index.php stuurt. Apache leest dat bestand alleen als de richtlijn AllowOverride dat toestaat. Zonder die richtlijn verschijnt de startpagina nog wel, maar geeft geen enkele andere route antwoord.
Het gedrag is gemeten op de health-route /up, die in elke recente installatie aanwezig is:
| Configuratie | / | /up |
|---|---|---|
AllowOverride All en rewrite actief | 200 | 200 |
AllowOverride None | 200 | 404 |
Dat is het symptoom om te herkennen: de startpagina werkt, al het andere geeft 404. Het probleem zit niet in de routes en niet in de code, maar in de configuratie van Apache.
Het begin van de .htaccess die Laravel meelevert, waar dit hele mechanisme van afhangt:
<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}]De installatie controleren
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 : 404De 404 op /.env is het verwachte resultaat: omdat de root van de site public/ is, staat het bestand buiten de geserveerde boom en is het domweg niet bereikbaar. Krijg je een 200, dan wijst DocumentRoot naar de projectroot in plaats van naar public/, en zijn je databasegegevens voor iedereen leesbaar.
Overstappen op HTTPS
Certbot past de virtual host zelf aan en zet de automatische vernieuwing op:
sudo apt install -y certbot python3-certbot-apache
sudo certbot --apache -d exemple.comDenk eraan om de debugmodus uit te zetten en APP_URL gelijk te trekken met het HTTPS-adres, anders blijven de links en assets die Laravel genereert naar HTTP wijzen:
APP_ENV=production
APP_DEBUG=false
APP_URL=https://exemple.comphp artisan config:cache
php artisan route:cache
php artisan view:cacheApache of nginx
| Apache | nginx | |
|---|---|---|
| PHP uitvoeren | ingebouwde module of PHP-FPM | alleen PHP-FPM |
| Configuratie per map | ja, via .htaccess | nee, alles in de configuratie van de site |
| Rewriting voor Laravel | meegeleverd door Laravel | zelf te schrijven in het location-blok |
| Shared hosting | heel gangbaar | zeldzaam |
Het .htaccess-bestand is het doorslaggevende voordeel van Apache op shared hosting: je stelt de rewriting in zonder toegang tot de configuratie van de server. Op een machine die je zelf beheert voldoen beide, en de keuze hangt af van wat je zelf kunt draaien.
Veelgemaakte fouten
chmod o+x /home/deploy, anders geeft Apache een permissiefout.