Si vous êtes comme moi, vous vous êtes souvent retrouvé à consulter la documentation de NGINX (vous savez, juste pour le plaisir) et à trouver ce qui suit :
les blocs
location
peuvent être imbriqués, avec quelques exceptions mentionnées ci-dessous
Et vous vous êtes dit : "Wow, c'est tellement peu spécifique. Qu’est‑ce que ça signifie vraiment d’imbriquer un bloc location
? Pourquoi est‑ce que je voudrais faire ça ? "
Eh bien, j'ai longuement étudié la configuration de nginx et je peux vous donner quelques indications sur la base de mes découvertes. Vous pouvez toujours consulter la documentation de NGINX si vous avez besoin d'un rafraîchissement sur le fonctionnement des blocs location
de la configuration de NGINX.
Quatre types de blocs location
peuvent être définis dans la configuration NGINX, je vais les appeler ainsi :
Les trois premiers sont similaires en ce sens qu'ils sont tous des emplacements de configuration NGINX de type préfixe. Ils doivent tous correspondre au début de l'Uniform Resource Identifier (URI) demandé. Ainsi, location/foo
ne correspondra jamais qu'à une requête pour http://some.site/foo/bar/,
il ne peut pas correspondre à http://some.site/bar/foo/,
même si /foo
apparaît quelque part dans l’URI. Les emplacements RegEx sont traités différemment, comme nous le verrons plus loin dans cet article, alors restez à l'écoute.
Lorsque NGINX traite une requête, il cherche quel bloc location
de type préfixe s’applique — un seul bloc peut s’appliquer. Pour ce faire, il parcourt le fichier de configuration NGINX de haut en bas - la construction du fichier est un autre sujet. Pour l'instant, il suffit de penser à un fichier de configuration NGINX à la recherche d'emplacements de type préfixe. Chaque fois qu'il trouve un emplacement qui correspond à la requête en cours, il vérifie si cet emplacement est plus long que le dernier qu'il a vu. Si c'est le cas, NGINX s'en souvient. Si l'emplacement correspond exactement et est de =-type
, alors il termine sa recherche et utilise immédiatement ce bloc d'emplacement sans même consulter les emplacements de type RegEx. Notamment, les emplacements de =-type
ne peuvent pas avoir d'emplacements imbriqués dans eux, et NGINX traitera cela comme une erreur si vous essayez.
S'il y a des locations de type préfixe imbriqués dans le bloc nouvellement rappelé, il les prend en compte à ce moment-là, comme s'ils étaient définis au niveau supérieur.
Si NGINX arrive à la fin du fichier sans avoir trouvé d’emplacement =-type
, il garde en mémoire le meilleur emplacement de type préfixe correspondant à la requête. Il testera ensuite tous les emplacements de type RegEx, en commençant par les emplacements définis à l'intérieur de l' emplacement de type préfixe qui correspond. La première fois que l'un de ces emplacements correspond, il arrête de chercher et utilise simplement le bloc d'emplacements de la configuration NGINX. Lorsqu'il arrive à la fin de l'emplacement de type préfixe sans correspondance, il continue à chercher au début du fichier de configuration NGINX.
Vous ne pouvez pas avoir un bloc location de type préfixe imbriqué dans un bloc location de type RegEx, et NGINX le signalera comme une erreur si vous essayez.
Enfin, il y a une dernière exception à ce qui se passe après que les emplacements de configuration NGINX aient fini d'être recherchés. Si le meilleur bloc location de type préfixe a le modificateur de préfixe fort(^~
), alors il ne vérifiera aucun emplacement RegEx, à l'exception des emplacements RegEx imbriqués.
J’espère que ces explications aideront mes collègues explorateurs de configurations NGINX ! Je me suis aventuré dans les arcanes de la config nginx récemment et j’ai trouvé difficile de dénicher une réponse complète, alors je partage ici mes découvertes. Vous êtes‑vous déjà lancé dans une enquête nginx ? Qu’avez‑vous trouvé ?
Partagez, discutez, débattez - faites-nous part de vos réflexions et de vos découvertes sur Discord.