为参数提供文件夹

Serve a folder for a parameter

我对 root 后的参数有疑问 url:

URL is : https://test/?version=12.1.0

我要的是version=numner.number.number开头的参数 在根目录“v12.1.0”

下提供一个文件夹
location ~ ^\?version=v(\d+\.\d+\.\d+)  {
     root           /var/www/test/htdocs/v;

}

这可能吗?我一直在尝试尝试文件和 root,但我无法让它工作。在这种情况下我应该使用地图吗?

Nginx 在处理之前规范化 URI。 ? 之前的 URI 部分可用作 $uri 变量,? 之后的 URI 部分可用作 $args 变量。

locationrewrite 指令对 $uri 变量的值进行操作,因此您目前的方法将不起作用,因为查询字符串已被删除。

$args 变量进一步拆分为其他单独的变量,因此 version= 参数的值可用作 $arg_version.


一种解决方案是使用 map 块来解码 $arg_version 并根据需要在 try_files 语句中使用映射变量。

例如:

map $arg_version $mypath {
    ~*^(v\d+\.\d+\.\d+)$ /;
    default              "";
}

server {
    ...

    root /var/www/test/htdocs;

    location ... {
        try_files $mypath$uri =404;
    }
}

我们可以按原样使用 $arg_version,但是 map 确保路径前缀经过清理并包含必要的 / 分隔符。

请注意 map 块位于 server 块之外。有关详细信息,请参阅 this document


根据您的具体要求,您也可以直接使用映射变量 root。例如:

root /var/www/test/htdocs/$mypath;