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

Материал из megapuper
Перейти к: навигация, поиск
(Полностью удалено содержимое страницы)
(Метка: очистка)
 
(не показаны 4 промежуточные версии этого же участника)
Строка 1: Строка 1:
Директива location служит для установки конфигурации в зависимости от URI-запроса. Синтаксис location в общем виде следующий:
 
<font color=green>Syntax</font>:  location [=|~|~*|^~] uri { ... }
 
          location @name { ... }
 
<font color=green>Context</font>:  server, location
 
Location определяется в контексте server (или в location в случае вложенной директивы). В одном настраиваемом виртуальном хосте могут использоваться разные конфигурации в зависимости от обрабатываемого сервером URI.
 
  
 
Префикс «@» («собака») определяет именованные расположения. Такие location’ы не используются для обработки обычных запросов. Вместо этого они используются для перенаправления запросов (пример №6). Они не могут быть вложенными и содержать в себе вложенные.
 
 
 
Порядок обработки:
 
 
1. = Строковые совпадения. Если найдено, проверка заканчивается. = значит полное совпадение шаблона и проверяемой строки, например = / - заход в секцию будет исключительно для корня, и даже файлы в корне уже сюда не подходят.<br>
 
2. ^~ Приоритетное строковое значение. Хотя правильнее было бы назвать «приоритетным регулярным выражением», поскольку в отличии от = требуется совпадение только начала. ^~ / полностью отключит регулярные выражения для секции server, если нет более точного location без ^~<br>
 
3. Строковые значения (/download/). Ищется максимальное совпадение, смотрится только с начала пути. Если нужно совпадение вида /*/download/, то это уже будет п.4, так что в уме можно читать такую запись как /download/* Но на этом проверка не заканчивается!<br>
 
4. ~, ~* Регулярные выражения, в порядке определения в конфиге. При совпадении - выполняется этот регэксп, проверка заканчивается. ~ — с учётом регистра, ~* — без.<br>
 
5. Если не было найдено подходящей регулярки, используется наибольшее совпадение из п.3.
 
 
 
'''Примеры использования location'''<br>
 
 
 
<font color=red>Пример конфигурации №1. Для корневого URI «/»</font>
 
location = / {
 
    <font color=grey>''# Расположение только для URI /''
 
    ''# При совпадении дальнейший поиск не осуществляется''</font>
 
}
 
 
 
<font color=red>Пример конфигурации №2. Базовый location</font>
 
location / {
 
    <font color=grey>''# Совпадает с URI всех запросов, т.к. они все начинаются с "/"
 
    ''# Но! Если будут найдены соответствия в расположениях''
 
    ''# с регулярными выражениями или с другим более длинным''
 
    ''# строковым литералом (например, "/data/"),''
 
    ''# то конфигурация для "/" не будет применена.''</font>
 
}
 
 
 
<font color=red>Пример конфигурации №3. Для URI вида «/data/.*»</font>
 
location /data/ {
 
    <font color=grey>''# Это расположение соответствует всем URI, начинающихся с "/data/"''
 
    ''# и продолжает поиск по оставшимся location'ам.''
 
    ''# В этом примере регулярные выражения и другие строковые литералы''
 
    ''# также будут проверены, и "location /data/" будет использован,''
 
    ''# если более конкретизирующие расположения не удовлетворят искомому ресурсу.''</font>
 
}
 
 
 
<font color=red>Пример конфигурации №4. Для URI вида «/img/.*»</font>
 
location ^~ /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>
 
}
 
 
 
<font color=red>Пример конфигурации №6. Именованный location</font>
 
location / {
 
    error_page 404 = @fallback;
 
}
 
 
location @fallback {
 
    <font color=grey>''# Если при внутреннем перенаправлении не нужно менять URI,''
 
    ''# то можно передать обработку ошибки в именованный location''</font>
 
}
 
 
 
<font color=red>Пример конфигурации №7. Выделение переменной</font>
 
location ~ ^/a/(?[a-zA-Z]+) {
 
  <font color=grey>''# Тут можно использовать переменную $myvar,''
 
  ''# которая представляет из себя строку из латиницы''</font>
 
  if ($myvar = "sth") { ... }
 
}
 
 
 
'''Примеры реальных nginx location’ов'''<br>
 
 
<font color=red>Anti-hotlinking</font><br>
 
Директива location для Anti-hotlinking (борьбы с использованием ресурсов сервера на сторонних ресурсах. Такой способ использования сетевых ресурсов называется hotlinking). Такое поведение хитрых разработчиков может заметно увеличить нагрузку на сервер.
 
location ~ \.(gif|png|jpe?g)$ {
 
    valid_referers none blocked mywebsite.com *.mywebsite.com;
 
    if ($invalid_referer) {
 
      return 403;
 
    }
 
}
 
 
 
<font color=red>Запрет на скрипты внутри директорий</font><br>
 
Следующий пример - запрет на скрипты в разрешённых для записи директориях:
 
location ~* /(images|cache|media|logs|tmp)/.*\.(php|pl|py|jsp|asp|sh|cgi)$ {
 
    error_page 403 /403.htm;
 
    return 403;
 
}
 
 
 
<font color=red>Включение autoindex</font><br>
 
В следующем примере location используется для включения autoindex в nginx (разрешение на вывод листинга каталога):
 
location /list_dir {
 
    autoindex on;
 
    autoindex_exact_size off;
 
    autoindex_localtime on;
 
}
 
 
 
<font color=red>Проксирование Nginx на другой IP</font><br>
 
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;
 
    }
 
}
 

Текущая версия на 20:40, 2 мая 2023