有没有一种干净的方式来结合nginx的位置规则?

假设在我的nginx服务器上,我想完成这两个要求:

1)所有*.php文件将被传递给PHP解释器

2)目录/private/将需要httpauthentication

如果我写

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

然后(如果我没有错)authentication将只适用于非PHP文件。 如果相反,我将^~标志添加到location块,然后我失去了PHP的位置。 这是合乎逻辑的,因为nginx只匹配一个位置块。 看来,剩下的唯一select是使用嵌套的位置:

 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添加嵌套的位置(也许还有其他文件types)。 但似乎是唯一的出路。 这是吗? 有人可以提出更好的解决scheme吗

很不幸的是,不行。 没有更简洁的方法,正如这里和文档中所解释的那样

但是,你可能应该使用一个单独的文件为您的PHPconfiguration,这样,所有你需要做的是这样的:

 location /private/ { auth_basic "Restricted"; .... location ~ \.php$ { include phpconf.conf; } } location ~ \.php$ { include phpconf.conf; }