Я хочу, чтобы первое превратилось во второе ...
/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-адреса до перезаписи, поэтому я не могу дать исчерпывающее правило для этого.