mirror of
https://github.com/projectsend/projectsend.git
synced 2026-09-12 06:48:55 +00:00
1aaab1bf66
The value was read with env() inside the withMiddleware closure in bootstrap/app.php. That closure runs when the HTTP kernel is resolved, which is before the dotenv bootstrapper reads .env — so on every web request env() returned null for anything set in .env, and the proxy was never trusted. It worked when the value came from a real environment variable, which is why the Docker compose path was fine and the manual install described in INSTALL.md, where we tell people to put it in .env, was not. Artisan bootstraps in the other order, so a check from the command line reported the setting as working the whole time. Behind a TLS-terminating proxy the consequence is not subtle. Laravel falls back to the connecting address and the plain scheme, builds every link and redirect with http:// while the browser is on https://, and marks the session cookie non-secure. The browser then declines to send that cookie to what it reads as a different, less secure origin, the session arrives empty, and the first write fails with a 419 that reads as "your session expired" — most often on the create-your-admin form, which is the first thing a new install submits. Afterwards each redirect leaves and re-enters over the wrong scheme, which is the random bounce back to the login screen people report as flakiness. Moved to config/trustedproxy.php, the key the framework's TrustProxies middleware already falls back to on its own. Config files load after dotenv, so the value is there whether it comes from .env or from the environment. This was also the only env() read outside config/, which means config:cache is no longer dangerous on this application. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
13 lines
535 B
PHP
13 lines
535 B
PHP
<?php
|
|
|
|
// Read here rather than in bootstrap/app.php's withMiddleware closure: that
|
|
// closure runs when the HTTP kernel is resolved, which under PHP-FPM is
|
|
// BEFORE the dotenv bootstrapper loads .env, so env('TRUSTED_PROXIES') is
|
|
// null there on every web request (it works in artisan, which bootstraps
|
|
// first — the discrepancy is invisible in CLI testing). Config files load
|
|
// after dotenv, and the framework's TrustProxies middleware falls back to
|
|
// this key on its own.
|
|
return [
|
|
'proxies' => env('TRUSTED_PROXIES'),
|
|
];
|