Как переписать URL для URL с несколькими параметрами запроса? - PullRequest
2 голосов
/ 16 января 2020

Сервер: Nginx

Приложение: PHP

URL-адрес:

/ p / all_articles / user / AB C

/ p / all_articles / user / ABC / page / 123

, что

/ index. php? p = all_articles & user = AB C

/ index. php? p = all_articles & user = ABC & page = 123

ABC = this could be a-zA-Z0-9 as it's username
123 = this could be page numbers 0-9

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

location /p/all_articles {
    rewrite ^/p/all_articles/user/(.*)?$ /index.php?p=all_articles&user=$1 last;
    rewrite ^/p/all_articles/user/(.*)/page(?:/([0-9]+))?$ /index.php?p=all_articles&user=$1&page=$2 last;
    try_files $uri $uri/ /index.php;
}

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


Аналогично

/ search / QUERY

/ search / QUERY / page / 123

, что

/ index. php? Search = QUERY

/ index. php? Search = QUERY & page = 123

QUERY = anything a-zA-Z0-9 and space
123 = this could be page numbers 0-9

как у all_articles, самое близкое, что я смог получить, это

location /search {
    rewrite ^/search /index.php?search last;
    rewrite ^/search/(.*)/page(?:/([0-9]+))?$ /index.php?search=$1&page=$2 last;
    try_files $uri $uri/ /index.php;
}

Но это работает, чтобы получить один из чистых U RL, когда цитируется другое переписывание, но не вместе.

Буду признателен, если кто-нибудь даст какие-либо ответы для решения этой проблемы.

1 Ответ

1 голос
/ 16 января 2020

Операторы rewrite оцениваются по порядку, поэтому более точное c регулярное выражение необходимо поместить перед менее конкретным c регулярным выражением.

С двумя регулярными выражениями:

^/search
^/search/(.*)/page(?:/([0-9]+))?$

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

Простое решение состоит в обратном порядке операторов rewrite в обоих из ваших location блоков.

...