Comment savoir quel location nginx a sélectionné ?
Collez la configuration et l'URI de la requête dans ce testeur pour voir le bloc gagnant et pourquoi chacun des autres a été éliminé. Sur un serveur en fonctionnement, ajoutez error_log /var/log/nginx/debug.log debug; et cherchez la ligne « using configuration », qui nomme le location retenu. Les deux approches répondent à des questions différentes : le journal dit ce qu'un serveur en production a fait, cette page dit ce que ferait une configuration que vous n'avez pas encore déployée.
Pourquoi ma regex de location nginx ne fonctionne-t-elle pas ?
Généralement pour l'une de trois raisons, et le tableau de décision indique laquelle. Une regex antérieure a déjà correspondu, la vôtre n'a donc jamais été exécutée — les regex sont testées dans l'ordre du fichier et la première correspondance l'emporte. Ou bien le plus long préfixe correspondant porte ^~, ce qui saute complètement la phase des regex. Ou bien la regex est correcte mais l'URI n'est pas celle que vous croyez : la correspondance s'exécute sur le chemin normalisé, après décodage des pourcentages et résolution des .., query string retirée.
Pourquoi ma correspondance exacte ne se déclenche-t-elle pas ?
Un location = exige que l'URI entière soit égale, pas qu'elle commence par le motif. location = /a/ ne correspond pas à /a, et location = /a ne correspond pas à /a/b. Les slashs finaux sont ici des caractères ordinaires, les deux formes sont donc des chaînes différentes. Quand un location exact correspond, la recherche s'arrête immédiatement et rien d'autre n'est même comparé.
nginx compare-t-il la query string dans un bloc location ?
Non. La query string est détachée pendant la normalisation et la sélection du location s'exécute sur le chemin seul. C'est pourquoi location = /a correspond à une requête vers /a?x=/b. Si vous devez brancher sur un paramètre, vous devez lire $arg_name ou $args dans le bloc. Une subtilité qui mérite d'être connue : %3F se décode en un point d'interrogation littéral qui reste dans le chemin, donc /a%3Fx=1 a une query string vide et un chemin contenant ?.
Puis-je utiliser la syntaxe des regex JavaScript dans un location nginx ?
Non — nginx utilise PCRE, et les différences comptent. Cette page s'exécute dans votre navigateur, où seules les expressions régulières ECMAScript existent : les constructions propres à PCRE sont donc détectées et signalées plutôt qu'évaluées de travers en silence — groupes atomiques, quantificateurs possessifs, modificateurs en ligne comme (?i), classes POSIX comme [[:alpha:]], et échappements comme \A et \K que JavaScript lit tranquillement comme des lettres ordinaires. Quand un location est signalé, les candidats restants sont quand même évalués dans l'ordre de nginx, mais le verdict de ce bloc demande vérification sur un vrai serveur. Si vous écrivez le motif lui-même, le testeur de regex couvre en profondeur la syntaxe ECMAScript. Les correspondances de préfixe des location nginx sont-elles sensibles à la casse ?
Sous Linux, oui — location /Static/ ne correspond pas à /static/x. Sur les systèmes de fichiers insensibles à la casse comme macOS et Cygwin, nginx compare les préfixes sans tenir compte de la casse et force en plus chaque location regex à se comporter comme ~*. Cette page modélise le comportement Linux, celui que les serveurs de production exécutent presque toujours. Si vous développez sur Mac et déployez sous Linux, cette différence peut masquer une règle cassée jusqu'à la mise en production.
try_files change-t-il le bloc location qui a été sélectionné ?
Non. La sélection du location se termine d'abord ; try_files s'exécute ensuite, à l'intérieur du bloc qui a déjà gagné. Si une requête n'atteint jamais le bloc contenant votre try_files, la directive est sans objet — la cause habituelle est une regex ~ \.php$ qui prend la requête avant que le bloc de préfixe portant le repli ait pu agir. Une redirection interne émise plus tard relance la correspondance : une URI réécrite est donc résolue de nouveau contre la liste des location, depuis le début.
Pourquoi nginx renvoie-t-il 301 quand je demande un répertoire sans slash ?
Deux mécanismes différents produisent cela. Si un location dont le nom se termine par / porte proxy_pass ou une autre directive *_pass, une requête vers le même chemin sans le slash reçoit un 301 pendant la sélection du location — avant qu'une seule regex ne soit évaluée. Par ailleurs, le module de fichiers statiques émet un 301 quand le chemin correspond à un vrai répertoire sur le disque. Le premier cas est visible ici ; le second dépend de votre système de fichiers. Ajouter location = /path supprime le premier.
Les blocs location imbriqués changent-ils le résultat ?
Oui, et d'une manière facile à manquer. nginx descend dans le location de préfixe gagnant et parcourt ses enfants : une regex imbriquée est donc essayée avant les regex du niveau parent. Un ^~ sur le bloc externe ne le protège pas de ses propres regex imbriquées, et l'imbrication peut rendre inaccessible un préfixe globalement plus long quand un frère du niveau externe gagne d'abord. Les blocs imbriqués sont modélisés ici avec l'indentation que vous leur avez donnée.
Ma configuration nginx est-elle envoyée quelque part ?
Non. L'analyse et la correspondance se font localement dans votre navigateur avec de simples opérations sur les chaînes — aucun appel serveur, rien n'est conservé. Cela compte plus ici que pour la plupart des outils, parce qu'un vrai bloc server contient des noms d'hôtes en amont, des ports internes, des chemins de certificats et des règles d'authentification. Vous n'avez pas à nous croire sur parole : ouvrez les outils de développement de votre navigateur et regardez le panneau Réseau rester silencieux pendant que vous tapez, ou coupez complètement la connexion et continuez à tester. L'absence de toute requête externe est également imposée par un test de contrat automatisé à chaque build, elle ne peut donc pas régresser en douce.