具有类似前缀的nginx位置
我正在尝试将nginx配置为服务于Angular SPA的不同版本,通常前缀为“dev”或“prod”,但位置为“dev”和“prod”,但我不希望nginx公开未配置的目录(在nginx.conf内) 比如说,具有类似前缀的nginx位置,nginx,Nginx,我正在尝试将nginx配置为服务于Angular SPA的不同版本,通常前缀为“dev”或“prod”,但位置为“dev”和“prod”,但我不希望nginx公开未配置的目录(在nginx.conf内) 比如说, http://myserver/dev http://myserver/dev-SomeFeatureBranch 如果使用精确匹配(=修饰符),则无法访问/dev或/dev SomeFeatureBranch下的任何内容,因此这不是一个选项 如果我没有指定一个修饰符,我会得到前
http://myserver/dev
http://myserver/dev-SomeFeatureBranch
如果使用精确匹配(=修饰符),则无法访问/dev或/dev SomeFeatureBranch下的任何内容,因此这不是一个选项
如果我没有指定一个修饰符,我会得到前缀匹配,它可以工作,但会暴露我在nginx.conf中没有配置的其他分支
例如,如果我在与其他开发分支相同的目录中有一个名为“dev SomePrivateBranch”的目录,并且我使用以下配置:
location / {
root ../www;
}
location /dev {
alias ../dev;
}
location /dev-SomeFeatureBranch {
alias ../dev-SomeFeatureBranch;
}
我可以有效地访问,因为它与“/dev”匹配,但我不想访问我没有明确配置的位置
再加上尾部斜杠的问题,我也希望能工作
我敢肯定,一旦你习惯了nginx的方式,这会非常简单,但我似乎无法让它在我的一生中发挥作用。如果你想让你的位置指向一个目录名,而不是一组碰巧以相同字符开头的随机目录名,你需要使用一个尾随的
/
例如:
location / {
root ../www;
}
location /dev/ {
alias ../dev/;
}
location /dev-SomeFeatureBranch/ {
alias ../dev-SomeFeatureBranch/;
}
location / {
root ../www;
}
location /dev/ {
root ..;
}
location /dev-SomeFeatureBranch/ {
root ..;
}
location / {
root ../www;
}
location = /dev { return 301 /dev/; }
location /dev/ {
root ..;
}
location = /dev-SomeFeatureBranch { return 301 /dev-SomeFeatureBranch/; }
location /dev-SomeFeatureBranch/ {
root ..;
}
location / {
root ../www;
}
location ~ ^/dev(|-SomeFeatureBranch)($|/) {
root ..;
}
请注意,位置
和别名
指令都应以/
结尾
别名可能是不必要的,因为根如果位置名和目录名相同,则代码>应起作用
例如:
location / {
root ../www;
}
location /dev/ {
alias ../dev/;
}
location /dev-SomeFeatureBranch/ {
alias ../dev-SomeFeatureBranch/;
}
location / {
root ../www;
}
location /dev/ {
root ..;
}
location /dev-SomeFeatureBranch/ {
root ..;
}
location / {
root ../www;
}
location = /dev { return 301 /dev/; }
location /dev/ {
root ..;
}
location = /dev-SomeFeatureBranch { return 301 /dev-SomeFeatureBranch/; }
location /dev-SomeFeatureBranch/ {
root ..;
}
location / {
root ../www;
}
location ~ ^/dev(|-SomeFeatureBranch)($|/) {
root ..;
}
我不喜欢根目录
和别名
的相对路径,但如果您喜欢的话,它仍然可以工作
管理/dev
和/dev/
的有效解决方案是从一个重定向到另一个。如果目录存在,Nginx会自动执行此操作。但在您的例子中,这并不明显,因为初始URI是在location/
块中处理的。您可以通过显式重定向来解决此问题
例如:
location / {
root ../www;
}
location /dev/ {
alias ../dev/;
}
location /dev-SomeFeatureBranch/ {
alias ../dev-SomeFeatureBranch/;
}
location / {
root ../www;
}
location /dev/ {
root ..;
}
location /dev-SomeFeatureBranch/ {
root ..;
}
location / {
root ../www;
}
location = /dev { return 301 /dev/; }
location /dev/ {
root ..;
}
location = /dev-SomeFeatureBranch { return 301 /dev-SomeFeatureBranch/; }
location /dev-SomeFeatureBranch/ {
root ..;
}
location / {
root ../www;
}
location ~ ^/dev(|-SomeFeatureBranch)($|/) {
root ..;
}
最后,如果所有位置
块的根都相同,那么还可以使用正则表达式,在这种情况下,可以将整个解决方案包装成一个表达式
例如:
location / {
root ../www;
}
location /dev/ {
alias ../dev/;
}
location /dev-SomeFeatureBranch/ {
alias ../dev-SomeFeatureBranch/;
}
location / {
root ../www;
}
location /dev/ {
root ..;
}
location /dev-SomeFeatureBranch/ {
root ..;
}
location / {
root ../www;
}
location = /dev { return 301 /dev/; }
location /dev/ {
root ..;
}
location = /dev-SomeFeatureBranch { return 301 /dev-SomeFeatureBranch/; }
location /dev-SomeFeatureBranch/ {
root ..;
}
location / {
root ../www;
}
location ~ ^/dev(|-SomeFeatureBranch)($|/) {
root ..;
}
请注意,正则表达式location
块的求值顺序非常重要。有关详细信息,请参阅。谢谢!这完全符合预期,也非常感谢您的额外解释,我现在明白了!