Debugmodus in Laravel in- en uitschakelen met APP_DEBUG

Debugmodus in Laravel in- en uitschakelen met APP_DEBUG
Kort antwoord

De debugmodus regel je met APP_DEBUG in het bestand .env: true lokaal, false in productie, altijd. Controleer de werkelijke status met php artisan about --only=environment. Heeft de wijziging geen effect, dan staat de configuratie in cache: draai php artisan config:clear.

De debugmodus bepaalt wat een bezoeker te zien krijgt wanneer je applicatie crasht: de volledige stack trace met broncode en omgevingsvariabelen, of een neutrale foutpagina. Het is een instelling van één regel, en tegelijk een van de meest voorkomende datalekken in productie.

Artikel uit het leertraject Webontwikkeling. Gecontroleerd op Laravel 13.30.1 met PHP 8.4.25.

In- en uitschakelen

Je regelt dat in het bestand .env in de root van het project, en nergens anders:

.env
APP_ENV=local
APP_DEBUG=true

Om hem uit te schakelen zet je de waarde op false:

.env
APP_ENV=production
APP_DEBUG=false

Controleer de werkelijke status zonder ook maar één regel code te schrijven:

bash
php artisan about --only=environment
code
  Environment ........................................................ local
  Debug Mode ...................................................... ENABLED

Dat is de enige controle die telt: ze toont de waarde die de applicatie echt gebruikt, cache inbegrepen.

De valkuil: de configuratie in cache

Je zet APP_DEBUG=false, je herlaadt, en de stack traces verschijnen nog altijd. Bijna altijd is de configuratiecache de oorzaak.

Zodra php artisan config:cache is uitgevoerd, schrijft Laravel alle opgeloste waarden weg in bootstrap/cache/config.php en leest het het bestand .env helemaal niet meer. Dat gedrag is gemeten:

Stap config('app.debug') env('APP_DEBUG')
APP_DEBUG=true, zonder cache true true
na config:cache, daarna in .env op false gezet true NULL
na config:clear false false

Twee lessen. De eerste: na elke wijziging van de .env op een server waar de configuratie in cache staat, moet je die cache opnieuw opbouwen.

bash
php artisan config:clear
# of, in productie, de cache meteen opnieuw opbouwen
php artisan config:cache
env() geeft NULL terug zodra de configuratie in cache staat

Dat is het minst bekende gevolg, en het raakt meer dan alleen de debugmodus. Een aanroep van env('MA_CLE') buiten een bestand in config/ geeft null terug zodra config:cache heeft gedraaid. De regel is streng: env() uitsluitend in config/, en overal elders config('fichier.cle').

Wat er in config/app.php staat

De configuratiesleutel doet niets anders dan de omgevingsvariabele uitlezen, met false als terugvalwaarde:

config/app.php
'debug' => (bool) env('APP_DEBUG', false),

Wijzig die regel niet. Ze is zo geschreven dat het standaardgedrag veilig is: ontbreekt APP_DEBUG in de .env, dan blijft de debugmodus uit. Gecontroleerd door de variabele te verwijderen: config('app.debug') geeft inderdaad false terug.

De waarde hard in config/app.php zetten heeft twee nadelen: het bestand staat in versiebeheer, dus de instelling reist naar alle omgevingen mee, en de .env wordt misleidend.

De aanvaarde waarden volgen de conversieregels van Laravel, regel voor regel gemeten:

In de .env config('app.debug')
APP_DEBUG=true of (true) of 1 true
APP_DEBUG=false of 0 false
APP_DEBUG=yes true
variabele ontbreekt false

yes levert true op omdat de string niet als boolean wordt herkend en dus wordt gecast. Een goede reden om het bij true en false te houden.

Waarom false in productie niet onderhandelbaar is

Met APP_DEBUG=true toont de foutpagina de stack trace, fragmenten van de broncode en de inhoud van de geladen omgevingsvariabelen. Een bezoeker die een fout uitlokt, leest dus je databasegegevens, je API-sleutels en de APP_KEY waarmee de sessies worden versleuteld.

Zoeken hoeft niet: één URL die een exception veroorzaakt, volstaat. Daarom raken Laravel-applicaties gecompromitteerd zonder dat er een echt lek in de code zit.

De juiste configuratie van een productieserver, zoals die is opgezet in de installatie van Laravel op Debian, past in drie regels:

.env
APP_ENV=production
APP_DEBUG=false
APP_URL=https://exemple.com

En daarna, na het deployen:

bash
php artisan config:cache
php artisan about --only=environment   # controle: Debug Mode moet OFF tonen

Dezelfde redenering geldt voor publieke formulieren, die je tegen geautomatiseerde inzendingen moet beschermen voordat je ze openstelt.

De fouten blijven raadpleegbaar, maar in de logs in plaats van in de browser:

bash
tail -f storage/logs/laravel.log

Dat pad bouw je met storage_path(), beschreven in de paden van de applicatie.

Veelgemaakte fouten

De configuratiecache negeert de .env Na config:cache leest Laravel het bestand .env niet meer. Elke wijziging vraagt om config:clear of om een nieuwe opbouw van de cache.
env() buiten config/ Zodra de configuratie in cache staat, geeft env() overal elders NULL terug. Gebruik config('fichier.cle').
config/app.php aanpassen in plaats van de .env Dat bestand staat in versiebeheer: de instelling reist naar alle omgevingen mee en de .env wordt misleidend.
APP_DEBUG=yes betekent true Elke string die niet als boolean wordt herkend, wordt naar true gecast. Houd het bij true en false.
APP_DEBUG=true in productie De foutpagina toont de stack trace, de broncode en de omgevingsvariabelen, inclusief de databasegegevens en de APP_KEY.

ConfigurationLaravelPHP

Damien Flandrin Webdeveloper sinds 2010, maker van Gekkode en Email Impact. Elk artikel wordt vóór publicatie getest op een echt project. Contact
Nieuwsbrief

Nieuwe tests, tutorials en projecten, per e-mail.

Reproduceerbare tests, geversioneerde code, gedateerde resultaten. Nooit spam.