Как на уровне nginx подменить урл?

225
16 декабря 2017, 08:01

Есть страница php, которая выводит шаблон, обращаться будут напрямую к php файлу, как подменить урл страниц (но чтобы php отработал нормально)? Подскажите, пожалуйста. Пример: http://bla-bla.ru/pages/urururu.php

Answer 1

КОРОТКО

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

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

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

будет перенаправлять запросы с http://bla-bla.ru/pages/urururu на http://bla-bla.ru/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;
}

Документация по ngx_http_rewrite_module: https://nginx.ru/ru/docs/http/ngx_http_rewrite_module.html#rewrite

READ ALSO
Функция mail() ошибка

Функция mail() ошибка

Здравствуйте Хочу протестировать отправку почты с локалки, именно так,но

140
как oтправить форму, которая находится на другом веб-сайте

как oтправить форму, которая находится на другом веб-сайте

На другом сайте есть одна страница, которая содержит форму, которая отправляет запрос ajaxЯ хочу создать PHP-скрипт, который заполнит эту форму...

141
Аналог microtime() под php

Аналог microtime() под php

Нужен аналог microtime() функции в php или что-то в этом родеФункция должна выдавать секунды и микросекунды

149