Kapitel 4 von 5

Laravel-Anwendung mit Apache auf Debian 13 ausliefern

geprüft am 7 September 2026 · 4 Min.

Schnelle Antwort

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

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

Das Paket libapache2-mod-php aktiviert PHP in Apache. Prüf es nach:

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

Aktiviere anschließend das Rewrite-Modul, das standardmäßig nicht eingeschaltet ist:

bash
sudo a2enmod rewrite

Das Projekt ablegen

Lege die Anwendung mit Composer unter einem Konto ohne Sonderrechte an:

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

Geben Sie anschließend den einzigen drei Ordnern Schreibrechte, die sie brauchen, database/ eingeschlossen, solange die Anwendung die bei der Installation erzeugte SQLite-Datenbank nutzt:

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 muss das Home-Verzeichnis durchqueren können

Den virtuellen Host anlegen

/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>

Aktiviere die Site, deaktiviere die Standard-Site und prüfe die Syntax:

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

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

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}]

Die Installation prüfen

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

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

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

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

.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 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

AllowOverride fehlt oder steht auf None Apache ignoriert die .htaccess von Laravel. Die Startseite antwortet, alle anderen Routen liefern 404. Symptom gemessen an der Route /up.
a2enmod rewrite vergessen Das Rewrite-Modul ist unter Debian nicht standardmäßig aktiv. Gleiche Wirkung wie oben.
DocumentRoot auf dem Projektverzeichnis Die Datei .env wird herunterladbar. Sie muss 404 liefern, denn das beweist, dass die Wurzel wirklich public/ ist.
Home-Verzeichnis nicht durchquerbar Ein Projekt in /home/deploy verlangt chmod o+x /home/deploy, sonst meldet Apache einen Berechtigungsfehler.
APP_URL nach Certbot auf HTTP geblieben Die von Laravel erzeugten Links und Assets zeigen weiterhin auf HTTP.
Newsletter

Neue Tests, Tutorials und Projekte, per E-Mail.

Reproduzierbare Tests, versionierter Code, datierte Ergebnisse. Niemals Spam.