Vous le voyez régulièrement dans divers tutoriels traitant des middlewares, mais savez-vous réellement ce que fait le middleware TrustProxies ?
Essayons dans cet article de mieux comprendre l'importance de ce middleware et de voir dans quelles situations il est nécessaire de le configurer.
Pour commencer, imaginons que le blog laravel-france.com soit simplement hébergé sur un seul serveur accessible depuis internet :

Depuis cette application, nous pouvons récupérer l'adresse IP de l'utilisateur directement depuis le helper request :
1Route::get('/', function () {2 return request()->ip(); // 92.145.202.103});
Cette IP est la bonne et correspond à celle de notre utilisateur, mais imaginons désormais que laravel-france.com soit hébergé sur une infrastructure plus complexes, à travers plusieurs serveurs accessibles depuis un load balancer :

Dans cette configuration, quand une requête arrive, le load balancer décide vers quel serveur la rediriger, permettant de mieux distribuer la charge entre les différents serveurs.
Désormais, quand nous cherchons à récupérer l'adresse IP de l'utilisateur, nous obtiendrons l'adresse IP ... du load balancer, et non celle de l'utilisateur !
1Route::get('/', function () {2 return request()->ip(); // 10.114.0.53});
Dans notre cas, cette dernière est d'ailleurs l'IP privée du load balancer !
Ce comportement, bien que gênant, est totalement normal et est dû au fait que le load balancer est un intermediaire entre l'utilisateur et les serveurs qui modifie l'adresse IP de la requête.
C'est pour répondre à cette contrainte que le middleware TrustProxies intervient.
Afin de récupérer la véritable adresse IP de l'utilisateur, il est nécessaire de préciser au middleware, depuis le fichier bootstrap/app.php
, que notre load balancer est un intermédiaire de confiance devant transmettre l'IP à l'origine de la connexion :
1return Application::configure(basePath: dirname(__DIR__)) 2 ->withRouting( 3 web: __DIR__.'/../routes/web.php', 4 commands: __DIR__.'/../routes/console.php', 5 health: '/up', 6 ) 7 ->withMiddleware(function (Middleware $middleware) { 8 $middleware->trustProxies(at: [ 9 '10.114.0.5', 10 ]); 11 })12 ->withExceptions(function (Exceptions $exceptions) {13 //14 })->create();
Avec cette configuration, Laravel récupérera l'adresse IP d'origine de l'utilisateur, celle qui a véritablement initié la requête vers le load balancer !
Cette configuration est essentielle, car en présence d'un load balancer, d'un proxy ou de tout autre mécanisme modifiant l'origine de la requête, Laravel pourrait également rencontrer des difficultés à générer des liens et à identifier le protocole utilisé pour la connexion (HTTP, HTTPS).
Attention, le bon fonctionnement du TrustProxies exige également que le load balancer soit correctement configuré pour faire transiter cette information, mais cela n'est plus de la responsabilité directe de votre application
Vous en savez désormais un peu plus sur l'importance de ce middleware et à quelles problématiques il répond !
A lire
Autres articles de la même catégorie

La notion de Manager dans Laravel
Introduction à un élément incontournable au cœur de Laravel, le Manager. Ce dernier est au commande d’un bon nombre des services.

William Suppo

Les Seeders
Créez rapidement des jeux de données grâce aux seeders !

Antoine Benevaut

Maîtrisez les relations belongs-to-many avec la méthode attach
Attardons nous sur les subtilités de la méthode attach

Mathieu De Gracia