斜线分隔参数

斜线分隔参数

您好,我在 nginx 中有以下配置:

if (!-e $request_filename)
{
rewrite ^/([a-zA-Z0-9_-]+)/ /$1.php;
rewrite ^/([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/ /$1.php?$2=$3;
rewrite ^/([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/ /$1.php?$2=$3&$4=$5;
}

它没有按预期工作。基本上,我想要做的是,如果有人请求 www.example.com/request/test/value,那么仅当 request.php 存在时才会调用 request.php?test=value,我希望系统地对数百个文件执行此操作,而不仅仅是我在此示例中使用的 request.php。此外,人们应该能够访问 /request 并到达 request.php(我已经实现了)

答案1

虽然我同意迈克尔的评论,但你可以尝试这样的事情:

location ~ ^(?<phpfile>[a-zA-Z0-9_-]+)/ {
    try_files $uri $phpfile.php;
}

location ~ ^(?<phpfile>[a-zA-Z0-9_-]+)/(?<arg1>[a-zA-Z0-9_-]+)/(?<val1>[a-zA-Z0-9_-]+)/ {
    try_files $uri $phpfile.php?$arg1=$val1;
}

在这里我们使用正则表达式捕获将 URI 的不同部分捕获到变量,然后将其用于指令try_files

我还没有测试过这种方法,所以不确定它是否有效。如果try_files似乎不起作用,您可以在位置内尝试此方法:

    if (!-e $request_filename) {
        if (-e $phpfile.php) {
            rewrite ^ $phpfile.php;
        }
    }

相关内容