What does the at-sign "@" mean in nginx location blocks?

Solution 1:

In the example that you quote in your question:

location @default {
  # ...
}

location /somewhere {
  try_files $uri @default;
}

If the incoming request is received at http://your-domain/somewhere, then the location matches /somewhere and it tries in two places sequentially to find a response, as specified by the try_files directive, responding with the first successful try.

  1. first it tests if there is a file at the location /somewhere, and if the file exists, it is returned in the response.
  2. if this fails it tries the try_files fallback option, @default, which is called a named_location. The response for this named_location is specified by the location @default directive. A named_location will never match an incoming request, and is used by reference to specify the response in other location directives.

In this way, an if statement can be avoided (if the file exists, then use it, else respond as spec'd in the location @default directive). So it can be used as a shorthand for an if condition. "If" statements are definitely "frowned upon" by the nginx authors (if is evil) as they have some limitations and may not give the expected result.

Solution 2:

The answer is in official documentation.

The “@” prefix defines a named location. Such a location is not used for a regular request processing, but instead used for request redirection. They cannot be nested, and cannot contain nested locations.

Tags:

Nginx