Ай Лайн
Связаться
Отдел продаж +7 (812) 385-74-84
Время работы пн-пт с 9:00 до 18:00

Nginx — rewrite и основы регулярных выражений

Изменение url

КОРОТКО

server {
    # ...
    rewrite ^/(.*)$ /pages/$1.php last;
    # ...
}

будет перенаправлять запросы с http://example.com/urururu на http://example.com/pages/urururu.php

server {
    # ...
    rewrite ^/pages/(.*)$ /pages/$1.php last;
    # ...
}

будет перенаправлять запросы с http://example.com/pages/urururu на http://example.com/pages/urururu.php

Замечание

Флаг last в конце директив rewrite значит, что данное правило, если оно применится, будет последним в цепи обработки данного пути и с ним больше никто ничего не сделает. Если данный флаг не поставить, то если путь будет соответствовать последующей директиве rewrite, то она его тоже обработает. Небольшой ликбез по регулярным выражениям

^/pages/(.*)$ - это регулярное выражение
Символ ^ - обозначает начало строки
Символ $ - обозначает конец строки
Символ . - обозначает любой символ
Символ * после точки - квантификатор и обозначает количество символов, в данном случае - любое
Таким образом сочетание символов .* - означает любое количество любых символов
Символы () - применяются для группировки ряда символов, позже в замене к этим сгруппированным символам можно обратиться через символ $ и номер группировки
Соответственно, если группировок несколько
Например /users/(.*)/events/(.*)
То обратиться к ним можно так:
/event.php?user=$1&event=$2
$1- первая группировка, $2- вторая группировка и т.д.

ПОДРОБНЕЕ О ДИРЕКТИВЕ rewrite

В NGINX есть модуль ngx_http_rewrite_module, который позволяет изменять URI запроса с помощью регулярных выражений PCRE, делать перенаправления и т.д.

Синтаксис: rewrite regex замена [флаг];

regex - это регулярное выражение, на соответствие которому будет проверяться путь
замена - это тот путь на который стоит перенаправить запрос.
[флаг] - необязательный параметр, один из 4 флагов(last, break, redirect, permanent)

Если указанное регулярное выражение соответствует URI запроса, URI изменяется в соответствии со строкой замены.

флаги

last - завершает обработку текущего набора директив
break - завершает обработку текущего набора директив
redirect - возвращает временное перенаправление с кодом 302
permanent - возвращает постоянное перенаправление с кодом 301

Контекст: server, location, if
Это значит, что данная директива может находиться в блоках

server{
    # rewrite ...
}
location * {
    # rewrite ...
}
if * {
    # rewrite ...
}

БОЛЬШЕ ПРИМЕРОВ

server{
    rewrite ^/api/(.*)$ /api.php?model=$1 last;
    rewrite ^/news/(.*)$ /news.php?slug=$1 last;
    rewrite ^/users/([\d]+)/notes/([\w_\-]+)$ /user_notes.php?user_id=$1&note=$2 last;
    rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break;
    rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra  break;
}
Оставить заявку