Антон Рябов bio photo

Антон Рябов

Не люблю бриться и у меня умный взгляд.

Email Twitter Telegram Github RSS

Директива location в Nginx

Обзор

За свою карьеру я собрал большой багаж опыта работы с веб-сервером Nginx и некоторые моменты освещал в данном блоге. Для навигации по теме используйте страницу Nginx 101


Location широко используется в конфигурациях Nginx, поэтому во избежание проблем веб-сайта, нужно понимать, как он работает.

Контекст

В конфигурации Nginx есть такое понятие как контекст. Контекст указывает на то, в каких частях конфига может быть использована та или иная директива. Если директива не прописана внутри какого-либо контекста, т.е. на самом верхнем уровне, это контекст main. Директивы events и http располагаются в контексте main, server — в http, а location — в server.

Синтаксис

Location c фильтрацией по URI:

location [ = | ~ | ~* | ^~ ] uri { ... }

=, ~, ~*, ^~ - необязательные модификаторы, которые меняют поведение обработчика запросов. В uri могут быть использованы символьные строки или регулярные выражения.

Префиксные location

Если в location не указан ни один модификатор, то он считается префиксным. Это значит, что uri запроса будет сравниваться с uri location с начала строки. Например, следующий location совпадает с любым запросом, начинающимся с /.

location / {
}

Однако, регулярные выражения имеют приоритет и будут сопоставлены в первую очередь.

Следующая конфигурация сопоставляется с любым запросом, начинающимся с /app/ и затем, поиск продолжается, если соответствия с регулярными выражениями не будут найдены, запрос будет соответствовать /app/

location /app/ {
}

Регулярные выражения

Для того чтобы использовать регулярные выражения, необходимо всегда использовать модификаторы:

  • ~ для соответствия с учетом регистра
  • ~* для соответствия без учета регистра

Nginx имеет возможность декодировать URI, в реальном времени. Например, для того, чтобы найти соответствия “/app/%20/images” вы можете использовать “/app/ /images”.

Cледующий location cовпадает с любым запросом заканчивающимся на png, ico, gif, jpg или jpeg.

location ~* \.(png|ico|gif|jpg|jpeg)$ {
}

Приоритет перед регулярными выражениями

По умолчанию, если URI совпадает и с префиксным, и с регулярным выражением, будет использован location с регулярным выражением. Но бывают случаи, когда необходимо изменить эту логику. Для этого используется модификатор ^~.

Например, у нас уже есть location, в который попадают запросы картинок с расширениями png, ico, gif, jpg или jpeg из предыдущего примера. Но мы хотим, чтобы все запросы начинающиеся с /img/avatar/ обрабатывались по другому. Тогда конфиг будет выглядеть так

location ~* \.(png|ico|gif|jpg|jpeg)$ {
}

location ^~ /img/avatar/ {
}

Запрос /img/banner.png будет обработан первым location, но запрос /img/avatar/user_365.jpg попадет во второй.

Точное соответствие

Модификатор = означает точное соответствие между URI-запросом и параметром location. Когда это происходит, поиск сразу же прекращается. Если вы видите, что ваше приложение часто обращается с запросом “/”, использование

location  = / {
}

ускорит обработку этого запроса. А если совпадает точно с запросом /app, используйте

location  = /app {
}

Реальные примеры location

Anti-hotlinking – защита файлов вашего сайта от прямого доступа с других сайтов или сервисов. Использование директивы Location для Anti-hotlinking

location ~ \.(gif|png|jpe?g)$ {
  valid_referers none blocked mywebsite.com *.mywebsite.com;
  if ($invalid_referer) {
    return 403;
  }
}

Другой пример, в котором запрещается доступ к выполнению скриптов из каталогов, в которые пользователь может загружать файлы

location ~* /(images|cache|media|logs|tmp)/.*.(php|pl|py|jsp|asp|sh|cgi)$ {
  return 403;
  error_page 403 /403_error.html;
}

Autoindex — это функция, которая включает листинг директорий по http средствами веб-сервера. Работает в том случае, если в директории нет настоящего index-файла. Благодаря этой функции можно без знаний программирования создать сайт, с которого можно скачивать файлы. Использование Location чтобы включить autoindex в Nginx:

location /myfiles {
  autoindex on;
  autoindex_exact_size off;
  autoindex_localtime on;
}

Если вы хотите больше узнать о директиве Location в nginx, можете прочитать официальную документацию.

P.S. Я намеренно опустил тему именнованных location, которые записываются как location @name { ... }. Во-первых, эта тема тянет на отдельную статью. Во-вторых, разобраться будет не сложно, если освоить базовое использование location.

#Nginx