nginx переписать регулярное выражение с несколькими обратными ссылками - PullRequest
1 голос
/ 04 апреля 2020

Я новичок в Nginx и пытаюсь настроить правила перезаписи для моих Nginx виртуальных хостов.

/{firstname}-{lastname}.php нужно переписать в /Individual.php?firstname={firstname}&lastname={lastname}

/{firstname}-{lastname}-Info.php?Id=123 чтобы переписать в /Individual-Info.php?Id={id}

Это сценарий счастливого случая. Иногда может быть также отчество, например,

{firstname}-{middle}-{lastname}.php, которое нужно переписать в Individual.php?firstname={firstname}&middle={middle}&lastname={lastname}

/{firstname}-{middle}-{lastname}-Info.php?Id=123&otherparam={otherparam}, чтобы переписать в /Individual-Info.php?Id={id}&otherparam={otherparam}

И иногда может быть просто фамилия

{lasname}.php для перезаписи на Individual.php?lastname={lastname}

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

1 Ответ

0 голосов
/ 04 апреля 2020

Вам необходимо упорядочить перезаписи так, чтобы чем больше c совпадений произошло до , тем меньше c совпадений. Сделайте сначала -Info, затем три имени, затем два имени, затем одно имя.

Перезаписи неоднозначны, и существует риск перенаправления l oop, особенно для Mr Individual . Вам, вероятно, следует поместить операторы rewrite в существующий блок location ~ \.php$ и использовать суффикс break. Подробнее см. в этом документе .

Например:

location ~ \.php$ {
    rewrite -Info\.php$ /Individual-Info.php break;
    rewrite ^/(.*)-(.*)-(.*)\.php$ /Individual.php?firstname=$1&middle=$2&lastname=$3 break;        
    rewrite ^/(.*)-(.*)\.php$ /Individual.php?firstname=$1&lastname=$2 break;        
    rewrite ^/(.*)\.php$ /Individual.php?lastname=$1 break;        
    ...
}

В ответ на ваш комментарий вы можете переписать только .php URI, которые не уже существует, используя try_files с именем location.

Например:

location ~ \.php$ {
    try_files $uri @rewrite;
    ...
}
location @rewrite {
    rewrite -Info\.php$ /Individual-Info.php last;
    rewrite ^/(.*)-(.*)-(.*)\.php$ /Individual.php?firstname=$1&middle=$2&lastname=$3 last;        
    rewrite ^/(.*)-(.*)\.php$ /Individual.php?firstname=$1&lastname=$2 last;        
    rewrite ^/(.*)\.php$ /Individual.php?lastname=$1 last;        
    return 404;
}

Обратите внимание, что вам нужно будет использовать rewrite...last вместо rewrite...break. Оператор try_files добавляется (или изменяется) в ваш существующий location ~ \.php$ блок.

...