如何在nginx中使用regex将变量分解为单独的变量

如何在nginx中使用regex将变量分解为单独的变量,regex,nginx,Regex,Nginx,我有一个开发服务器设置,它执行一些动态根操作,允许我通过检测服务器名称中的域和子域并使用它设置根来设置快速测试项目 server_name ~^(?<subdomain>\w*?)?\.?(?<domain>\w+\.\w+)$; server\u name~ ^(?\w*?)?\?(?\w+\.\w+$; 这很好,允许我基于变量$subdomain和$domain设置根路径 但是对于特定类型的项目,我还需要能够根据子域是否包含破折号将子域变量进一步拆分为两个变量 e

我有一个开发服务器设置,它执行一些动态根操作,允许我通过检测服务器名称中的域和子域并使用它设置根来设置快速测试项目

server_name ~^(?<subdomain>\w*?)?\.?(?<domain>\w+\.\w+)$;
server\u name~ ^(?\w*?)?\?(?\w+\.\w+$;
这很好,允许我基于变量$subdomain和$domain设置根路径

但是对于特定类型的项目,我还需要能够根据子域是否包含破折号将子域变量进一步拆分为两个变量

e、 g

mysubdomain不应分割,而应保留为变量$subdomain


但是mysubdomain tn将被分成两个变量$subdomain$version

您需要将正则表达式复杂化一点:

server_name ~^(?<subdomain>\w*?)(-(?<version>\w*?)?)?\.?(?<domain>\w+\.\w+)$;
server\u name~ ^(?\w*?)((?\w*?)?)?\?(?\w+\。\w+$;
编辑

有几种方法可以调试Nginx配置,包括,在某些极端情况下,甚至可以使用real。然而,在大多数情况下,添加到响应中就足以获得必要的信息

例如,我使用以下简单配置测试了上面的正则表达式:

server {
    listen 80;

    server_name ~^(?<subdomain>\w*?)(-(?<version>\w*?)?)?\.?(?<domain>\w+\.\w+)$;

    # Without this line your browser will try to download
    # the response as if it were a file
    add_header Content-Type text/plain;

    # You can name your headers however you like
    add_header X-subdomain "$subdomain";
    add_header X-domain "$domain";
    add_header X-version "$version";

    return 200;
}
服务器{
听80;
服务器名称^(?\w*?)((?\w*?)?\?(?\w+\.\w+$);
#如果没有这一行,您的浏览器将尝试下载
#将响应视为一个文件
添加标题内容类型text/plain;
#您可以随意命名标题
添加_头X-子域“$subdomain”;
添加_头X域“$domain”;
添加标题X-version“$version”;
返回200;
}

然后我将域mydomain.local、mysubdomain-tn.mydomain.local和mysubdomain-tn.mydomain.local添加到我的文件中,在带有“打开调试”面板的浏览器中打开它们(在大多数浏览器中为F12),并得到了相应的结果。

您需要将正则表达式复杂化一点:

server_name ~^(?<subdomain>\w*?)(-(?<version>\w*?)?)?\.?(?<domain>\w+\.\w+)$;
server\u name~ ^(?\w*?)((?\w*?)?)?\?(?\w+\。\w+$;
编辑

有几种方法可以调试Nginx配置,包括,在某些极端情况下,甚至可以使用real。然而,在大多数情况下,添加到响应中就足以获得必要的信息

例如,我使用以下简单配置测试了上面的正则表达式:

server {
    listen 80;

    server_name ~^(?<subdomain>\w*?)(-(?<version>\w*?)?)?\.?(?<domain>\w+\.\w+)$;

    # Without this line your browser will try to download
    # the response as if it were a file
    add_header Content-Type text/plain;

    # You can name your headers however you like
    add_header X-subdomain "$subdomain";
    add_header X-domain "$domain";
    add_header X-version "$version";

    return 200;
}
服务器{
听80;
服务器名称^(?\w*?)((?\w*?)?\?(?\w+\.\w+$);
#如果没有这一行,您的浏览器将尝试下载
#将响应视为一个文件
添加标题内容类型text/plain;
#您可以随意命名标题
添加_头X-子域“$subdomain”;
添加_头X域“$domain”;
添加标题X-version“$version”;
返回200;
}

然后,我将域mydomain.local、mysubdomain-tn.mydomain.local和mysubdomain-tn.mydomain.local添加到我的文件中,在带有“打开调试”面板的浏览器中打开它们(在大多数浏览器中为F12),并获得了该文件。

谢谢!我靠得很近,但我不知道如何让正则表达式在有破折号和没有破折号的情况下工作。无法轻松检查ngix配置中的变量会导致调试困难。有什么建议吗?@Finglish,我在原来的答案上添加了一些额外的解释。再次感谢!谢谢你的建议。真的很有帮助!:)谢谢我靠得很近,但我不知道如何让正则表达式在有破折号和没有破折号的情况下工作。无法轻松检查ngix配置中的变量会导致调试困难。有什么建议吗?@Finglish,我在原来的答案上添加了一些额外的解释。再次感谢!谢谢你的建议。真的很有帮助!:)