Вопрос или проблема
Я наткнулся на несколько вопросов и ответов, которые используют этот синтаксис:
location @default {
# ...
}
location /somewhere {
try_files $uri @default;
}
Я искал везде в Гугле и не могу найти какую-либо документацию по этому поводу. Что это значит и какие у него практические применения? Это какая-то декларация и присвоение переменной? Извините за вопрос новичка.
Ответ содержится в официальной документации.
Префикс “@” определяет именованное местоположение. Такое местоположение не используется для обычной обработки запроса, а вместо этого используется для перенаправления запроса. Они не могут быть вложенными и не могут содержать вложенные местоположения.
В приведенном вами примере:
location @default {
# ...
}
location /somewhere {
try_files $uri @default;
}
Если входящий запрос поступает на http://your-domain/somewhere, тогда местоположение соответствует /somewhere и оно пытается в двух местах последовательно найти ответ, как указано в директиве try_files, отвечая первым успешным вариантом.
- сначала проверяется, существует ли файл по адресу /somewhere, и если файл существует, он возвращается в ответе.
- если это не удается, оно пытается использоватьFallback-опцию try_files, @default, которая называется named_location. Ответ для этой named_location указан в директиве
location @default
. named_location никогда не будет соответствовать входящему запросу и используется по ссылке для указания ответа в других директивах местоположения.
Таким образом, можно избежать утверждения if (если файл существует, тогда используем его, иначе отвечаем, как указано в директиве location @default). Поэтому это можно использовать как сокращение для условия if. Утверждения “если” определенно “осуждаются” авторами nginx (if is evil), так как у них есть некоторые ограничения и они могут не дать ожидаемого результата.
Ответ или решение
Вопрос о значении символа «@» в блоках location
в Nginx часто возникает у новых пользователей, и правильная интерпретация этого элемента важна для корректного написания конфигураций. Давайте разберем, что такое «@» в этом контексте и как его можно эффективно использовать.
Что такое именованные местоположения в Nginx?
Символ «@» используется для обозначения именованных местоположений (named locations) в конфигурации Nginx. Именованные местоположения отличаются от обычных местоположений тем, что они не используются для обработки регулярных запросов. Вместо этого именованные местоположения служат для использования в других директивах, например в try_files
или error_page
, предоставляя механизм перенаправления запросов.
Основные характеристики именованных местоположений:
-
Не обрабатывают входящие запросы напрямую: Именованное местоположение не может быть непосредственно вызвано в качестве URL-адреса. Оно предназначено для использования в условиях других директив.
-
Не допускают вложенности: Внутри именованного местоположения нельзя интерактивно определять другие вложенные местоположения.
-
Применяются для управления потоком: Именованные местоположения часто используются для упрощения логики обработки запросов, заменяя условные операторы.
Пример использования
Рассмотрим следующий пример конфигурации:
location @default {
# Директивы для обработки запросов, которые направляются к @default
}
location /somewhere {
try_files $uri @default;
}
Здесь, когда запрос приходит по адресу http://your-domain/somewhere
:
- Nginx сначала проверяет, существует ли файл по указанному пути ($uri).
- Если файл найден, он возвращается в ответе.
- Если файл не существует, происходит переход к именованному местоположению
@default
, где могут быть заданы дополнительные директивы для обработки запроса.
Практическое применение
Использование именованных местоположений, таких как @default
, позволяет избегать громоздких конструкций на основе условных операторов if
, которые менее желательны по рекомендациям разработчиков Nginx. Этот подход делает конфигурацию более чистой и понятной, а также снижает вероятность ошибок, связанных с неправильной логикой обработки.
Рекомендации по использованию
- Применяйте именованные местоположения для обработки ошибок, перенаправления и любой логики, где вы хотите избежать использования условных операторов.
- Убедитесь, что именованные местоположения хорошо документированы, чтобы другие разработчики понимали логику конфигурации.
- Избегайте излишней сложности в конфигурации — используйте именованные местоположения только тогда, когда это действительно необходимо.
Заключение
Использование символа «@» в конфигурации Nginx открывает новые возможности для управления потоками запросов и упрощения обработки ошибок. Именованные местоположения позволяют сделать вашу конфигурацию более строгой и понятной, избегая состояний, которые могут возникнуть из-за неправильного использования условных операторов. Углубленное понимание этой концепции будет полезным для всех, кто стремится стать мастером работы с Nginx.