Que signifie le signe «@» dans les blocs d'emplacement nginx?

20

J'ai rencontré quelques questions et réponses ici qui utilisent cette syntaxe:

location @default {
  # ...
}

location /somewhere {
    try_files $uri @default;
}

J'ai cherché haut et bas sur les Googles et je n'arrive pas à trouver de documentation à ce sujet. Qu'est-ce que cela signifie et quelles sont ses utilisations pratiques? S'agit-il d'une sorte de déclaration et d'affectation de variables? Désolé pour la question de débutant.

ccnokes
la source

Réponses:

10

La réponse est dans la documentation officielle .

Le préfixe «@» définit un emplacement nommé. Un tel emplacement n'est pas utilisé pour un traitement de demande normal, mais plutôt pour la redirection de demande. Ils ne peuvent pas être imbriqués et ne peuvent pas contenir d'emplacements imbriqués.

Sans chambre à air
la source
37
Selon l'explication, cela ne dit absolument rien.
Stefano Borini
Donc, ce n'est pas particulièrement différent d'avoir un bloc normal avec interne?
James
14

Dans l'exemple que vous citez dans votre question:

location @default {
  # ...
}

location /somewhere {
  try_files $uri @default;
}

Si la demande entrante est reçue sur http: // votre-domaine / quelque part , alors l'emplacement correspond à / quelque part et il essaie à deux endroits séquentiellement de trouver une réponse, comme spécifié par la directive try_files, répondant avec le premier essai réussi.

  1. il teste d'abord s'il y a un fichier à l'emplacement / quelque part, et si le fichier existe, il est renvoyé dans la réponse.
  2. si cela échoue, il essaie l'option de repli try_files, @default, qui est appelée un emplacement_nommé . La réponse pour cet emplacement nommé est spécifiée par la location @defaultdirective. Un emplacement_nommé ne correspondra jamais à une demande entrante et est utilisé par référence pour spécifier la réponse dans d'autres directives d'emplacement.

De cette façon, une instruction if peut être évitée (si le fichier existe, alors utilisez-le, sinon répondez comme spécifié dans la directive location @default). Il peut donc être utilisé comme raccourci pour une condition if. Les déclarations "si" sont définitivement "désapprouvées" par les auteurs de nginx ( si c'est mal ) car elles ont certaines limites et peuvent ne pas donner le résultat escompté.

Les Nightingill
la source