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

Антон Рябов

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

Email Twitter Github RSS

Обзор

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

Синтаксис директивы location в Nginx

Синтаксис:

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

Контекст:

server / location

Во-первых, важно знать, что в зависимости от URI, который вы обрабатываете, могут быть применены различные конфигурации, вы можете использовать символьные строки, а также регулярные выражения, как вам угодно.

Директива Location с регулярными выражениями

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

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

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

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

Location и символьные строки

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

Примеры директивы Location

# Если совпадает точно с запросом /.
location  = / {
}

# Cовпадает с любым запросом, начинающимся с /, однако, регулярные выражения будут
# сопоставлены в первую очередь.
location  / {
}

# Данная конфигурация сопоставляется с любым запросом, начинающимся с  /data/ и затем,
# поиск продолжается,
# в этом примере будут проверены регулярные выражения и если соответствия не будут найдены, запрос будет соответствовать /data/
location /data/ {
}

# Совпадает с любым запросом, начинающимся с  /img/ и затем поиск прекращается,
# в этом примере нет регулярных выражений.
location ^~ /img/ {
}

# Совпадает с любым запросом заканчивающимся на png, ico, gif, jpgили jpeg. Однако, все
# запросы /img/ будут обработаны в предыдущем location
location ~* \.(png|ico|gif|jpg|jpeg)$ {
}

Реальные примеры директив location

Использование директивы 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;
}

Использование Location чтобы включить autoindex** в nginx:

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

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

  • * Anti-hotlinking – защита файлов вашего сайта от прямого доступа с других сайтов или сервисов.
  • ** Autoindex — это функция, которая включает листинг директорий по http, средствами веб-сервера (конечно, если в директории нет настоящего index-файла).
#Nginx