Nginx переписать с условным назначением - PullRequest
1 голос
/ 02 января 2012

У меня есть сайт с двумя схемами URL RESTful:

foo.com/model/id и foo.com/model/id/action

Фактические страницы, обслуживаемые этими URL-адресами, имеют вид

$model.php?id=$id и $model_$action.php?id=$id соответственно.

У меня есть одно регулярное выражение, которое будет соответствовать обоим случаям ^(\w+)s/([A-z0-9]+)(?:/(\w+))?/?$, и я хотел бы использовать одно правило Nginx для перезаписи для обоих типов URL, но яЯ не уверен, как это сделать.Я полагаю, что в псевдокоде правило будет выглядеть примерно так:

rewrite ^(\w+)s/([A-z0-9]+)(?:/(\w+))?/?$ /(($3) ? $1_$3.php?$id=$2 : $1.php?$id=2)

Это неправильный синтаксис (насколько я знаю), но можно ли что-то подобное сделать в Nginx?

1 Ответ

1 голос
/ 03 января 2012

Переписать возможные URL по очереди, начиная с самой длинной до самой короткой, чтобы совпадающие совпадающие строки, в этом случае "/ model / id", будут сначала сопоставляться с более длинной строкой URL.

location / {
    # For "/model/id/action" to "$model_$action.php?id=$id"
    rewrite ^/(.+)/(.+)/(.+)(/?)$ $1_$3.php?id=$2 last;

    # For "/model/id" to "$model.php?id=$id"
    rewrite ^/(.+)/(.+)(/?)$ $1.php?id=$2 last;
}
location ~ .+\.php$ {
    # Handle PHP
}

"(/?)" На всякий случай, когда URL-адреса иногда заканчиваются косой чертой. Если они никогда не делают, это может быть удалено. В этом случае, вероятно, лучше всего специально добавить закрывающую косую черту и иметь "(/?)" Как "/".

...