NGINX. Location — различия между версиями

Материал из megapuper
Перейти к: навигация, поиск
Строка 38: Строка 38:
 
<font color=red>Пример конфигурации №3. Для URI вида «/data/.*»</font>
 
<font color=red>Пример конфигурации №3. Для URI вида «/data/.*»</font>
 
  location /data/ {
 
  location /data/ {
     # Это расположение соответствует всем URI, начинающихся с "/data/"
+
     <font color=grey>''# Это расположение соответствует всем URI, начинающихся с "/data/"''
     # и продолжает поиск по оставшимся location'ам.
+
     ''# и продолжает поиск по оставшимся location'ам.''
     # В этом примере регулярные выражения и другие строковые литералы
+
     ''# В этом примере регулярные выражения и другие строковые литералы''
     # также будут проверены, и "location /data/" будет использован,
+
     ''# также будут проверены, и "location /data/" будет использован,''
     # если более конкретизирующие расположения не удовлетворят искомому ресурсу.
+
     ''# если более конкретизирующие расположения не удовлетворят искомому ресурсу.''</font>
 
  }
 
  }
  
 
<font color=red>Пример конфигурации №4. Для URI вида «/img/.*»</font>
 
<font color=red>Пример конфигурации №4. Для URI вида «/img/.*»</font>
location ^~ /img/ {
+
location ^~ /img/ {
     # Соответствует любому URI, начинающемуся с "/img/".
+
     <font color=grey>''# Соответствует любому URI, начинающемуся с "/img/".''
     # Если соответствие установлено - останавливает дальнейший поиск,
+
     ''# Если соответствие установлено - останавливает дальнейший поиск,''
     # не проверяя регулярные выражения, т.к. используется
+
     ''# не проверяя регулярные выражения, т.к. используется''
     # префикс ^~ "крышечка/циркумфлекс тильда".
+
     ''# префикс ^~ "крышечка/циркумфлекс тильда".''</font>
 +
}
 +
 
 +
<font color=red>Пример конфигурации №5. Для графических форматов</font>
 +
location ~* \.(png|ico|gif|jpg|jpeg)$ {
 +
    <font color=grey>''# Данное расположение соответствует всем запрашиваемым URI,
 +
    ''# оканчивающихся ".png", ".ico", ".gif", ".jpg" или ".jpeg".''
 +
    ''# При этом надо заметить, что запросы внутри расположения "/img/"''
 +
    ''# будут обработаны в location из примера №4''
 +
    ''# Т.е., если расположения из примеров №4 и №5 разместить в таком же''
 +
    ''# порядке в реальном конфиге, то до этого расположения ресурсов''
 +
    ''# дойдут только те картинки, которые лежат вне расположения "/img/"''</font>
 
}
 
}
  
Пример конфигурации №5. Для графических форматов
+
<font color=red>Пример конфигурации №6. Именованный location</font>
location ~* \.(png|ico|gif|jpg|jpeg)$ {
+
location / {
    # Данное расположение соответствует всем запрашиваемым URI,
 
    # оканчивающихся ".png", ".ico", ".gif", ".jpg" или ".jpeg".
 
    # При этом надо заметить, что запросы внутри расположения "/img/"
 
    # будут обработаны в location из примера №4
 
    # Т.е., если расположения из примеров №4 и №5 разместить в таком же
 
    # порядке в реальном конфиге, то до этого расположения ресурсов
 
    # дойдут только те картинки, которые лежат вне расположения "/img/"
 
}
 
Пример конфигурации №6. Именованный location
 
location / {
 
 
     error_page 404 = @fallback;
 
     error_page 404 = @fallback;
 
}
 
}

Версия 11:27, 2 сентября 2021

Директива location служит для установки конфигурации в зависимости от URI-запроса. Синтаксис location в общем виде следующий:

Syntax:   location [=|~|~*|^~] uri { ... }
          location @name { ... }
Context:  server, location

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


Префикс «@» («собака») определяет именованные расположения. Такие location’ы не используются для обработки обычных запросов. Вместо этого они используются для перенаправления запросов (пример №6). Они не могут быть вложенными и содержать в себе вложенные.


Порядок обработки:

1. = Строковые совпадения. Если найдено, проверка заканчивается. = значит полное совпадение шаблона и проверяемой строки, например = / - заход в секцию будет исключительно для корня, и даже файлы в корне уже сюда не подходят.
2. ^~ Приоритетное строковое значение. Хотя правильнее было бы назвать «приоритетным регулярным выражением», поскольку в отличии от = требуется совпадение только начала. ^~ / полностью отключит регулярные выражения для секции server, если нет более точного location без ^~
3. Строковые значения (/download/). Ищется максимальное совпадение, смотрится только с начала пути. Если нужно совпадение вида /*/download/, то это уже будет п.4, так что в уме можно читать такую запись как /download/* Но на этом проверка не заканчивается!
4. ~, ~* Регулярные выражения, в порядке определения в конфиге. При совпадении - выполняется этот регэксп, проверка заканчивается. ~ — с учётом регистра, ~* — без.
5. Если не было найдено подходящей регулярки, используется наибольшее совпадение из п.3.


Примеры использования location


Пример конфигурации №1. Для корневого URI «/»

location = / {
   # Расположение только для URI /
   # При совпадении дальнейший поиск не осуществляется
}

Пример конфигурации №2. Базовый location

location / {
   # Совпадает с URI всех запросов, т.к. они все начинаются с "/"
   # Но! Если будут найдены соответствия в расположениях
   # с регулярными выражениями или с другим более длинным
   # строковым литералом (например, "/data/"),
   # то конфигурация для "/" не будет применена.
}

Пример конфигурации №3. Для URI вида «/data/.*»

location /data/ {
   # Это расположение соответствует всем URI, начинающихся с "/data/"
   # и продолжает поиск по оставшимся location'ам.
   # В этом примере регулярные выражения и другие строковые литералы
   # также будут проверены, и "location /data/" будет использован,
   # если более конкретизирующие расположения не удовлетворят искомому ресурсу.
}

Пример конфигурации №4. Для URI вида «/img/.*»

location ^~ /img/ {
   # Соответствует любому URI, начинающемуся с "/img/".
   # Если соответствие установлено - останавливает дальнейший поиск,
   # не проверяя регулярные выражения, т.к. используется
   # префикс ^~ "крышечка/циркумфлекс тильда".
}

Пример конфигурации №5. Для графических форматов

location ~* \.(png|ico|gif|jpg|jpeg)$ {
   # Данное расположение соответствует всем запрашиваемым URI,
   # оканчивающихся ".png", ".ico", ".gif", ".jpg" или ".jpeg".
   # При этом надо заметить, что запросы внутри расположения "/img/"
   # будут обработаны в location из примера №4
   # Т.е., если расположения из примеров №4 и №5 разместить в таком же
   # порядке в реальном конфиге, то до этого расположения ресурсов
   # дойдут только те картинки, которые лежат вне расположения "/img/"

}

Пример конфигурации №6. Именованный location

location / {
   error_page 404 = @fallback;

}

location @fallback {

   # Если при внутреннем перенаправлении не нужно менять URI,
   # то можно передать обработку ошибки в именованный location

} Пример конфигурации №7. Выделение переменной location ~ ^/a/(?[a-zA-Z]+) {

  # Тут можно использовать переменную $myvar,
  # которая представляет из себя строку из латиницы
  if ($myvar = "sth") { ... }

} Примеры реальных nginx location’ов Anti-hotlinking Директива location для Anti-hotlinking (борьбы с использованием ресурсов с вашего сервера на сторонних ресурсах. Такой способ использования ваших сетевых ресурсов называется 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)$ {

   error_page 403 /403.htm;
   return 403;

} Включение autoindex В следующем примере location используется для включения autoindex в nginx (Разрешение на вывод листинга каталога):

location /list_dir {

   autoindex on;
   autoindex_exact_size off;
   autoindex_localtime on;

}} Проксирование Nginx на другой IP server {

   listen   80;
   server_name домен;
   access_log off;
   error_log off;
   location / {

# remote HTTP server

       proxy_pass http://IP:Порт;

proxy_redirect http://IP:Порт /; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Real-IP $remote_addr;

       proxy_connect_timeout 600;
   }

}