|
|
(не показаны 22 промежуточные версии этого же участника) |
Строка 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). Они не могут быть вложенными и содержать в себе вложенные.
| |
− |
| |
− |
| |
− | Порядок обработки:
| |
− |
| |
− | = Строковые совпадения. Если найдено, проверка заканчивается. = значит полное совпадение шаблона и проверяемой строки, например = / — заход в секцию будет исключительно для корня, и даже файлы в корне уже сюда не подходят.
| |
− | ^~ Приоритетное строковое значение. Хотя по-моему было бы правильнее назвать «приоритетным регулярным выражением», поскольку в отличии от = требуется совпадение только начала. ^~ / полностью отключит регулярные выражения для секции server, если нет более точного location без ^~
| |
− | Строковые значения (/download/). Ищется максимальное совпадение, смотрится только с начала пути. Если нужно совпадение вида /*/download/, то это уже будет п.4, так что в уме можно читать такую запись как /download/* Но на этом проверка не заканчивается!
| |
− | ~, ~* Регулярные выражения, в порядке определения в конфиге. При совпадении — выполняется этот регэксп, проверка заканчивается. ~ — с учётом регистра, ~* — без.
| |
− | Если не было найдено подходящей регулярки, используется наибольшее совпадение из п.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;
| |
− | }
| |
− | }
| |