有没有一种简洁的方法来组合nginx的location规则?

假设在我的nginx服务器上,我想要实现以下两个要求: 1)所有的*.php文件都需要传递给php解释器处理。 2)目录/private/需要进行HTTP身份验证。 如果我写下:
location /private/  {
  auth_basic            "Restricted";
  ....
}

location ~ \.php$ {
    fastcgi_pass   127.0.0.1:9000;
     .... more settings
}

然后(如果我没记错的话),身份验证只会应用于非php文件。如果我在location块中添加^~标志,那么我就失去了php位置。这是合理的,因为nginx只匹配一个location块。

看来唯一剩下的选择是使用嵌套的location:

location /private/  {
  auth_basic            "Restricted";
  ....
    location ~ \.php$ {
       fastcgi_pass   127.0.0.1:9000;
         .... more settings
    }
}

location ~ \.php$ {
    fastcgi_pass   127.0.0.1:9000;
     .... more settings
}
这对我来说看起来相当笨拙而脆弱:每次我添加一个受保护的目录位置(或者一些设有特殊设置的目录),我都必须记得为PHP(以及可能是其他文件类型)添加嵌套位置。但似乎这是唯一的解决办法。是这样吗?有人能提出更好的解决方案吗?
1个回答

很遗憾,没有更好的方法,正如这里这里文档中所解释的那样。 但是,你应该为你的php配置使用一个单独的文件,这样,你只需要做这个:
location /private/  {
    auth_basic            "Restricted";
    ....
    location ~ \.php$ {
        include phpconf.conf;
    }
}

location ~ \.php$ {
   include phpconf.conf;
}