如何使用正则表达式将变量分解为nginx中的单独变量

时间:2015-03-30 19:49:06

标签: regex nginx

我有一个开发服务器设置,可以进行一些动态生根,允许我通过检测server_name中的域和子域并使用它来设置root来设置快速测试项目。

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

这很好用,允许我根据变量$ subdomain和$ domain

设置根路径

对于特定类型的项目,我还需要能够进一步将子域变量拆分为两个变量,如果子域包含破折号的话。

e.g。

mysubdomain 不应拆分,但保持为变量 $ subdomain

mysubdomain-tn 将分为2个变量 $ subdomain $ version

1 个答案:

答案 0 :(得分:5)

您需要更多地复杂化正则表达式:

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

修改

有几种方法可以调试Nginx配置,包括debugging logecho module,在某些极端情况下甚至可以使用真实的debugger。但是,在大多数情况下,在响应中添加custom headers足以获取必要的信息。

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

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;
}

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