Laravel-Anwendung mit Apache auf Debian 13 ausliefern
geprüft am 7 September 2026 · 4 Min.
Drei Bedingungen, damit Apache Laravel ausliefert: DocumentRoot auf das Verzeichnis public/, sudo a2enmod rewrite und AllowOverride All für dieses Verzeichnis. Ohne die letzte Direktive ignoriert Apache die von Laravel mitgelieferte .htaccess: Die Startseite erscheint, aber alle anderen Routen liefern 404.
Apache ist im Shared Hosting und auf lange gewachsenen Servern nach wie vor der verbreitetste Webserver. Damit eine Laravel-Anwendung hinter Apache läuft, brauchst du drei Dinge: einen vHost, dessen Wurzel auf public/ zeigt, das aktivierte Rewrite-Modul und AllowOverride All, damit die von Laravel mitgelieferte .htaccess überhaupt gelesen wird.
Dieses Kapitel gehört zur Laravel-Installation auf Debian im Lernpfad Webentwicklung. Wird der dritte Punkt vergessen, ist das fast immer die Ursache für Routen, die mit 404 antworten. Die Schritte sind auf Debian 13 mit Apache 2.4.68 und Laravel 13.30.1 geprüft.
Apache und das PHP-Modul installieren
sudo apt update
sudo apt install -y apache2 libapache2-mod-php
apache2 -vServer version: Apache/2.4.68 (Debian)Das Paket libapache2-mod-php aktiviert PHP in Apache. Prüf es nach:
a2query -m | grep phpphp8.4 (enabled by maintainer script)Aktiviere anschließend das Rewrite-Modul, das standardmäßig nicht eingeschaltet ist:
sudo a2enmod rewriteDas Projekt ablegen
Lege die Anwendung mit Composer unter einem Konto ohne Sonderrechte an:
su - deploy
composer create-project laravel/laravel /home/deploy/app --no-interaction
cd /home/deploy/app
php artisan --version # Laravel Framework 13.30.1Geben Sie anschließend den einzigen drei Ordnern Schreibrechte, die sie brauchen, database/ eingeschlossen, solange die Anwendung die bei der Installation erzeugte SQLite-Datenbank nutzt:
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 muss das Home-Verzeichnis durchqueren könnenDen virtuellen Host anlegen
<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>Aktiviere die Site, deaktiviere die Standard-Site und prüfe die Syntax:
sudo a2ensite laravel
sudo a2dissite 000-default
sudo apache2ctl configtest
sudo systemctl reload apache2Syntax OKAllowOverride All: die Zeile, an der alles hängt
Laravel liefert eine public/.htaccess mit, die alle Anfragen an index.php weiterreicht. Apache liest diese Datei nur, wenn die Direktive AllowOverride es erlaubt. Fehlt sie, erscheint zwar die Startseite, aber keine andere Route antwortet.
Gemessen wurde das Verhalten an der Health-Route /up, die in jeder aktuellen Installation vorhanden ist:
| Konfiguration | / | /up |
|---|---|---|
AllowOverride All und rewrite aktiv | 200 | 200 |
AllowOverride None | 200 | 404 |
Das ist das Symptom, an dem du es erkennst: Die Startseite läuft, alles andere liefert 404. Das Problem steckt weder in den Routen noch im Code, sondern in der Apache-Konfiguration.
Der Anfang der von Laravel mitgelieferten .htaccess, auf der dieser Mechanismus beruht:
<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}]Die Installation prüfen
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 : 404Der 404 auf /.env ist das erwartete Ergebnis: Da die Wurzel der Site public/ ist, liegt die Datei außerhalb des ausgelieferten Verzeichnisbaums und ist schlicht nicht erreichbar. Bekommst du 200, dann zeigt DocumentRoot auf das Projektverzeichnis statt auf public/, und deine Datenbank-Zugangsdaten sind öffentlich lesbar.
Auf HTTPS umstellen
Certbot passt den virtuellen Host selbst an und richtet die automatische Erneuerung ein:
sudo apt install -y certbot python3-certbot-apache
sudo certbot --apache -d exemple.comDenk daran, den Debug-Modus abzuschalten und APP_URL auf die HTTPS-Adresse zu setzen. Sonst zeigen die von Laravel erzeugten Links und Assets weiterhin auf HTTP:
APP_ENV=production
APP_DEBUG=false
APP_URL=https://exemple.comphp artisan config:cache
php artisan route:cache
php artisan view:cacheApache oder nginx
| Apache | nginx | |
|---|---|---|
| PHP-Ausführung | integriertes Modul oder PHP-FPM | ausschließlich PHP-FPM |
| Konfiguration je Verzeichnis | ja, über .htaccess | nein, alles in der Site-Konfiguration |
| Rewrite für Laravel | von Laravel mitgeliefert | selbst im location-Block zu schreiben |
| Shared Hosting | sehr verbreitet | selten |
Die .htaccess ist der entscheidende Vorteil von Apache im Shared Hosting: Damit konfigurierst du das Rewriting, ohne Zugriff auf die Serverkonfiguration zu haben. Auf einer Maschine, die du selbst administrierst, taugen beide, und die Wahl richtet sich danach, was du sicher betreiben kannst.
Häufige Fehler
chmod o+x /home/deploy, sonst meldet Apache einen Berechtigungsfehler.