O que significa o sinal de arroba "@" nos blocos de localização do nginx?

20

Encontrei algumas perguntas e respostas aqui que usam esta sintaxe:

location @default {
  # ...
}

location /somewhere {
    try_files $uri @default;
}

Eu pesquisei alto e baixo no Google e parece que não consigo encontrar nenhuma documentação dele. O que significa e quais são alguns de seus usos práticos? É algum tipo de declaração e atribuição de variável? Desculpem esta questão de novato.

ccnokes
fonte

Respostas:

10

A resposta está na documentação oficial .

O prefixo "@" define um local nomeado. Esse local não é usado para um processamento de solicitação regular, mas para redirecionamento de solicitação. Eles não podem ser aninhados e não podem conter locais aninhados.

Tubeless
fonte
37
Como explicação, isso não diz absolutamente nada.
Stefano Borini
Portanto, isso não é particularmente diferente de ter um bloco normal com interno?
James
14

No exemplo que você cita na sua pergunta:

location @default {
  # ...
}

location /somewhere {
  try_files $uri @default;
}

Se a solicitação de entrada for recebida em http: // seu-domínio / em algum lugar , o local corresponderá a / em algum lugar e ele tentará em dois locais sequencialmente encontrar uma resposta, conforme especificado pela diretiva try_files, respondendo com a primeira tentativa bem-sucedida.

  1. primeiro ele testa se existe um arquivo no local / em algum lugar e, se o arquivo existe, ele é retornado na resposta.
  2. se isso falhar, ele tenta a opção de fallback try_files, @default, que é chamada de local_do_ nomeado . A resposta para esse local_ nomeado é especificada pela location @defaultdiretiva. Um local_ nomeado nunca corresponderá a uma solicitação recebida e é usado por referência para especificar a resposta em outras diretivas de local.

Dessa forma, uma instrução if pode ser evitada (se o arquivo existir, use-o, caso contrário, responda conforme especificado na diretiva location @default). Portanto, ele pode ser usado como um atalho para uma condição if. As declarações "If" são definitivamente "desaprovadas" pelos autores do nginx ( se for mau ), pois possuem algumas limitações e podem não fornecer o resultado esperado.

Les Nightingill
fonte