Обзор
За свою карьеру я собрал большой багаж опыта работы с веб-сервером Nginx и некоторые моменты освещал в данном блоге. Для навигации по теме используйте страницу Nginx 101
Location широко используется в конфигурациях Nginx, поэтому во избежание проблем веб-сайта, нужно понимать, как он работает.
Контекст
В конфигурации Nginx есть такое понятие как контекст. Контекст указывает на то, в каких частях конфига может быть использована та или иная директива. Если директива не прописана внутри какого-либо контекста, т.е. на самом верхнем уровне, это контекст main. Директивы events и http располагаются в контексте main, server — в http, а location — в server.
Синтаксис
Location c фильтрацией по URI:
=
, ~
, ~*
, ^~
- необязательные модификаторы, которые меняют поведение обработчика запросов. В uri
могут быть использованы символьные строки или регулярные выражения.
Префиксные location
Если в location не указан ни один модификатор, то он считается префиксным. Это значит, что uri запроса будет сравниваться с uri location с начала строки. Например, следующий location совпадает с любым запросом, начинающимся с /.
Однако, регулярные выражения имеют приоритет и будут сопоставлены в первую очередь.
Следующая конфигурация сопоставляется с любым запросом, начинающимся с /app/ и затем, поиск продолжается, если соответствия с регулярными выражениями не будут найдены, запрос будет соответствовать /app/
Регулярные выражения
Для того чтобы использовать регулярные выражения, необходимо всегда использовать модификаторы:
~
для соответствия с учетом регистра~*
для соответствия без учета регистра
Nginx имеет возможность декодировать URI, в реальном времени. Например, для того, чтобы найти соответствия “/app/%20/images” вы можете использовать “/app/ /images”.
Cледующий location cовпадает с любым запросом заканчивающимся на png, ico, gif, jpg или jpeg.
Приоритет перед регулярными выражениями
По умолчанию, если URI совпадает и с префиксным, и с регулярным выражением, будет использован location с регулярным выражением. Но бывают случаи, когда необходимо изменить эту логику. Для этого используется модификатор ^~
.
Например, у нас уже есть location, в который попадают запросы картинок с расширениями png, ico, gif, jpg или jpeg из предыдущего примера. Но мы хотим, чтобы все запросы начинающиеся с /img/avatar/
обрабатывались по другому. Тогда конфиг будет выглядеть так
Запрос /img/banner.png
будет обработан первым location, но запрос /img/avatar/user_365.jpg
попадет во второй.
Точное соответствие
Модификатор =
означает точное соответствие между URI-запросом и параметром location. Когда это происходит, поиск сразу же прекращается. Если вы видите, что ваше приложение часто обращается с запросом “/”, использование
ускорит обработку этого запроса. А если совпадает точно с запросом /app, используйте
Реальные примеры location
Anti-hotlinking – защита файлов вашего сайта от прямого доступа с других сайтов или сервисов. Использование директивы Location для Anti-hotlinking
Другой пример, в котором запрещается доступ к выполнению скриптов из каталогов, в которые пользователь может загружать файлы
Autoindex — это функция, которая включает листинг директорий по http средствами веб-сервера. Работает в том случае, если в директории нет настоящего index-файла. Благодаря этой функции можно без знаний программирования создать сайт, с которого можно скачивать файлы. Использование Location чтобы включить autoindex в Nginx:
Если вы хотите больше узнать о директиве Location в nginx, можете прочитать официальную документацию.
P.S. Я намеренно опустил тему именнованных location, которые записываются как location @name { ... }
. Во-первых, эта тема тянет на отдельную статью. Во-вторых, разобраться будет не сложно, если освоить базовое использование location.