【问题标题】:Serve a folder for a parameter为参数提供文件夹
【发布时间】:2021-11-27 11:57:19
【问题描述】:

我对根 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$2;

}

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

【问题讨论】:

    标签: nginx parameters location nginx-reverse-proxy nginx-config


    【解决方案1】:

    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+)$ $1/;
        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;
    

    【讨论】:

    • 问题是你声明了一个位置。我使用的根位置。那里已经有一个根文件夹,但我只希望在传递该参数时为该 nginx 文件夹提供服务。示例> www.test.com > 服务器根文件夹,但如果 url 是 www.test.com?version=12.9.0 - 服务器根目录内的文件夹。有可能吗?
    • 这正是我的解决方案所做的。如果 version 技巧适用于每个 URI,您可能只需要使用 root /var/www/test/htdocs/$mypath; 语句。
    • 但是如果我这样定义根文件夹。每个其他子文件夹在搜索中都会被忽略,它会使用 $mypath 搜索根文件夹。仅当它具有参数 ?version=12.1.0 (示例)时,该条件才适用于 root /var/www/test/htdocs/
    • 如果缺少version 参数或v.n.n.n 以外的任何参数,则$mypath 的值为空字符串 - 请参阅default 子句。
    • 我明天去测试。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2019-09-08
    • 1970-01-01
    • 2023-04-10
    • 2015-02-21
    • 1970-01-01
    • 1970-01-01
    • 2013-12-28
    • 2015-03-11
    相关资源
    最近更新 更多