将位置中的 nginx $query_string 转换为 params

将位置中的 nginx $query_string 转换为 params

我想使用位置并将 URL 转换为服务器中的 GET 参数。我不关心 URL 中是否有一个、两个或更多参数,但如果我转到此 URL,则会出现类似以下情况

https://www.example.com/page/one/two/three/....

它应该把我送到这个

https://www.example.com/page/index.php?site=one&id=two&args=three....

我设置了代码以获取 URL 中的第一个参数,但我无法进一步分解它,它总是page/在一个参数中返回所有内容

        location ~ ^/page/(.*)$ {
            try_files $uri /page/index.php?site=$1
        }

有什么建议么?

答案1

您需要改进正则表达式中捕获的范围。捕获(.*)将吸收任何内容并且是贪婪的。您可以在捕获中使用惰性量词(例如(.*?)),或者使用排除分隔符的字符类/(例如([^/]+))。

例如,将这三种情况作为单独的规则来实现:

location ~ ^/page/([^/]+)/([^/]+)/([^/]+) {
    try_files $uri /page/index.php?site=$1&id=$2&args=$3;
}
location ~ ^/page/([^/]+)/([^/]+) {
    try_files $uri /page/index.php?site=$1&id=$2;
}
location ~ ^/page/([^/]+) {
    try_files $uri /page/index.php?site=$1;
}

正则表达式按顺序进行评估,直到找到匹配项,因此必须将更具体的规则放在更不具体的规则之前。此外,这些都需要放在块之后location ~ \.php$,否则您的 PHP URI 将会中断。

这一有用的资源正则表达式语法。

相关内容