具有相似前缀的nginx位置

时间:2019-01-31 21:45:02

标签: nginx

我正在尝试将nginx配置为服务于不同版本的Angular SPA,通常以“ dev”或“ prod”为前缀,但位置为“ dev”和“ prod”,但我不想nginx公开未配置的目录(在nginx.conf内部)。

例如,

http://myserver/dev  
http://myserver/dev-SomeFeatureBranch

如果我使用完全匹配(=修饰符),则无法到达/ dev以下或/ dev-SomeFeatureBranch以下的任何内容,因此这不是一种选择。

如果我不指定修饰符,则会得到前缀匹配,可以使用,但是会暴露出我尚未在nginx.conf中配置的其他分支

例如,如果我在与其他Dev分支相同的目录中有一个名为“ dev-SomePrivateBranch”的目录,并且我使用以下配置:

    location / {
        root   ../www;
    }
    location /dev {
        alias ../dev;
    }

    location /dev-SomeFeatureBranch {
        alias ../dev-SomeFeatureBranch;
    }

我可以有效地到达http://myserver/dev-SomePrivateBranch,因为它与“ / dev”相匹配,但是我不想到达未明确配置的位置。

除了带有斜杠的问题外,我还希望http://myserver/dev/http://myserver/dev一样工作

我敢肯定,一旦您习惯了nginx的方式,这就是超级简单,但我似乎无法在我的一生中使它正常工作。

1 个答案:

答案 0 :(得分:1)

如果要让您的位置引用单个目录名而不是偶然出现的以相同字符开头的随机目录名,则需要使用结尾/

例如:

location / {
    root  ../www;
}
location /dev/ {
    alias ../dev/;
}
location /dev-SomeFeatureBranch/ {
    alias ../dev-SomeFeatureBranch/;
}

请注意,locationalias指令都应以/结尾。


alias可能是不必要的,因为如果位置名称和目录名称相同,root ..;应该可以工作。

例如:

location / {
    root  ../www;
}
location /dev/ {
    root  ..;
}
location /dev-SomeFeatureBranch/ {
    root  ..;
}

我不喜欢rootalias的相对路径,但是如果您愿意,它仍然可以正常工作。


管理/dev/dev/的有效解决方案是从一个重定向到另一个。如果目录存在,Nginx会自动执行此操作。但是在您的情况下,这并不明显,因为初始URI是在location /块中处理的。您可以通过显式重定向解决问题。

例如:

location / {
    root  ../www;
}
location = /dev { return 301 /dev/; }
location /dev/ {
    root  ..;
}
location = /dev-SomeFeatureBranch { return 301 /dev-SomeFeatureBranch/; }
location /dev-SomeFeatureBranch/ {
    root  ..;
}

最后,如果所有location块的根都相同,则也可以使用正则表达式,在这种情况下,可以将整个解决方案打包为一个表达式。

例如:

location / {
    root  ../www;
}
location ~ ^/dev(|-SomeFeatureBranch)($|/) {
    root  ..;
}

请注意,正则表达式location块的求值顺序很重要。有关详细信息,请参见this document