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 d'
emplacement
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 l'imbrication d'un bloc d'emplacement signifie en fait? Pourquoi voudrais-je le faire ?"
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 d'emplacement de la configuration de NGINX.
Quatre types d'emplacements de configuration NGINX peuvent être définis, et je les appellerai 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, l 'emplacement /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
est là quelque part. 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 essaiera de déterminer quel bloc d'emplacement de configuration NGINX s'applique - un seul emplacement 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 emplacements 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 de configuration NGINX sans avoir trouvé un emplacement =
, il aura un enregistrement de l'emplacement de type préfixe le plus long qui correspond à cette 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 d'emplacement de type préfixe imbriqué dans un bloc d'emplacement 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 d'emplacement 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 cela a été utile pour mes collègues enquêteurs NGINX. J'ai sauté dans le trou du lapin des complexités de la configuration de NGINX il y a quelque temps et j'ai trouvé qu'il était étonnamment difficile de trouver une réponse complète, alors j'ai voulu partager ce que j'ai trouvé après avoir plongé en profondeur. Avez-vous déjà mené votre propre enquête sur NGINX ? Qu'avez-vous trouvé ?
Partagez, discutez, débattez - faites-nous part de vos réflexions et de vos découvertes sur Discord.