|
|
(не показаны 2 промежуточные версии этого же участника) |
Строка 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;
| |
− | }
| |
− | }
| |