是否有一种干净的方法来组合 nginx 位置规则?

是否有一种干净的方法来组合 nginx 位置规则?

假设在我的 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 /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;
}

相关内容