我想使用位置并将 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 将会中断。
看这一有用的资源正则表达式语法。