Nginx 如何为具有多个查询参数的url重写url?

Nginx 如何为具有多个查询参数的url重写url?,nginx,url-rewriting,Nginx,Url Rewriting,服务器:Nginx 应用程序:PHP 有问题的URL是 /p/所有文章/用户/ABC /p/all_articles/user/ABC/page/123 那是 /php?p=all_articles&user=ABC /index.php?p=all_articles&user=ABC&page=123 尝试了许多组合和选项,以下让我更接近预期的结果,但它并不完美 location /p/all_articles { rewrite ^/p/all_articles/user/(.*)?

服务器:Nginx

应用程序:PHP

有问题的URL是

/p/所有文章/用户/ABC

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

那是

/php?p=all_articles&user=ABC

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

尝试了许多组合和选项,以下让我更接近预期的结果,但它并不完美

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;
}
上面的“重写位置”块仅在引用其中一个时才会产生结果,而另一个将起作用,但不能同时使用


同样地

/搜索/查询

/搜索/查询/第页/123

那是

/php?search=QUERY

/php?search=QUERY&page=123

就像所有的文章一样,我能得到的最接近的是

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;
}
但是,当引用另一个重写时,这可以得到其中一个干净的URL,但不能同时得到


如果有人能回答这个问题,我将不胜感激

rewrite
语句按顺序求值,因此需要将更具体的正则表达式放在不太具体的正则表达式之前

使用两个正则表达式:

^/search
^/search/(.*)/page(?:/([0-9]+))?$
第一个正则表达式将匹配与第二个正则表达式匹配的任何内容,因此永远不会对第二个正则表达式求值

简单的解决方案是颠倒
位置
块中的
重写
语句的顺序

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;
}
^/search
^/search/(.*)/page(?:/([0-9]+))?$