Назад | Перейти на главную страницу

nginx перезаписывает регулярное выражение для управления версиями API

Я хочу, чтобы первое превратилось во второе ...

/widget              => /widget/index.php
/widget/             => /widget/index.php
/widget?act=list     => /widget/index.php?act=list
/widget/?act=list    => /widget/index.php?act=list
/widget/list         => /widget/index.php?act=list
/widget/v2?act=list  => /widget/v2.php?act=list
/widget/v2/?act=list => /widget/v2.php?act=list
/widget/v2/list      => /widget/v2.php?act=list

v2 также может быть v45, в основном "v \ d +"
act, в данном случае «список», может иметь много значений, и будут добавлены другие.
Полагаю, любые дополнительные параметры запроса будут просто передаваться с помощью $ args.

Обычно URL-адреса, в которых не указана версия, попадают в index.php, который затем может решить, какой конкретный файл версии включить. Я боюсь петель - они должны сидеть в

location /widget {

право?.

(Что касается размещения версии API в URL-адресе, я не пытаюсь использовать RESTful, а целевая аудитория небольшая)

Также приветствуются ресурсы о том, как сделать это полностью в index.php с использованием «маршрутизаторов»: - /

С помощью трех правил вы можете сопоставить примеры и следующие версии виджетов:

rewrite ^\/widget\/(v\d+)\/?(\?act=)?(.*)$ /widget/$1.php?act=$2 last;
rewrite ^\/widget\/?$ /widget/index.php last;
rewrite ^\/widget\/?(\?act=)?(.*) /widget/index.php?act=$2 last;

Я написал их с помощью онлайн-тестера регулярных выражений, но не настраивал тестовую среду с Nginx.

Первое правило будет соответствовать всем случаям с номером версии, с косой чертой или без нее, а также с аргументом? Act или без него.

Второе правило будет охватывать основной вызов виджета без каких-либо аргументов, снова с косой чертой в конце и без нее.

Последнее правило будет охватывать все вызовы не версионных виджетов, с косой чертой или без нее, а также с или без ?act аргумент.

Порядок последних двух правил важен.

server {
    ...
    rewrite ^/widget$                   /widget/index.php           last;
    rewrite ^/widget/$                  /widget/index.php           last;
    rewrite ^/widget\?act=list$         /widget/index.php?act=list  last;
    rewrite ^/widget/\?act=list$        /widget/index.php?act=list  last;
    rewrite ^/widget/list$              /widget/index.php?act=list  last;
    rewrite ^/widget/v(\d+)\?act=list$  /widget/v$1.php?act=list    last;
    rewrite ^/widget/v(\d+)/\?act=list$ /widget/v$1.php?act=list    last;
    rewrite ^/widget/v(\d+)/list$       /widget/v$1.php?act=list    last;
    ...
    location /widget {
        ...
    }
}

Для соответствия цифрам вам нужна группа захвата (), это концепция регулярного выражения.
Группа захвата упоминается в перезаписи как $1 что означает "обратная ссылка 1"

Хотя я не знаю, будет ли этот список для вас устойчивым.
Например, вместо захвата ?act=list, почему бы не захватить все и не добавить обратно в правило перезаписи следующим образом:

rewrite ^/widget(.*)         /widget/index.php?$1  last;

Я не на 100% уверен, как будут выглядеть ваши URL-адреса до перезаписи, поэтому я не могу дать исчерпывающее правило для этого.