使用基于正则表达式的主机设置 Nginx FCGI

使用基于正则表达式的主机设置 Nginx FCGI

我正在尝试构建一个部署服务器,该服务器将具有为多个目录提供服务的通配符主机(假设我正在预览某个项目的 master 和 dev 分支),但我一直无法将计算出的文档根目录传递给 fcgi。要描述的 MCVE 示例如下:

server {
        listen 80;
        server_name ~(\w+).tld;
        root /srv/www/$1;
        index index.html index.php;

        location / {
                try_files $uri $uri/ =404;
        }

        location ~ \.php$ {
               include snippets/fastcgi-php.conf;
               fastcgi_pass unix:/run/php/php7.0-fpm.sock;
        }
}

如果我尝试获取类似的东西alpha.tld/index.txt,nginx 会正确地为我提供该文件,计算$document_root/srv/www/alpha。然而,当我尝试调用 FCGI 时,魔法就消失了:

2017/03/28 14:33:18 [debug] 1761#1761: *8 open index "/srv/www/beta/index.php"
2017/03/28 14:33:18 [debug] 1761#1761: *8 internal redirect: "/index.php?"
// nginx has found the file, that's great
...
2017/03/28 14:33:18 [debug] 1761#1761: *8 http script copy: "/srv/www/"
2017/03/28 14:33:18 [debug] 1761#1761: *8 http script capture: ""
2017/03/28 14:33:18 [debug] 1761#1761: *8 http script var: "/index.php"
2017/03/28 14:33:18 [debug] 1761#1761: *8 trying to use file: "/index.php" "/srv/www//index.php"
// but it has failed to pass captured regex match down to fcgi

我使用 Google 和“nginx fcgi regex”之类的请求都找不到任何东西,手动设置 FCGI 参数也无济于事。有没有什么解决方案?

ps 实际设置比示例要复杂得多,我无法提前为所有可能的主机创建 nginx 配置,因此除了 regexp 之外我实际上不能使用任何东西。

答案1

好吧,这突然起作用了:

server {
        listen 80;
        // nothing has changed but regexp group naming and referencing
        server_name ~(?<subdomain>\w+).tld;
        root /srv/www/$subdomain;
        index index.html index.php;

        location / {
                try_files $uri $uri/ =404;
        }

        location ~ \.php$ {
               // even $document_root seems to be computed as expected
               include snippets/fastcgi-php.conf;
               fastcgi_pass unix:/run/php/php7.0-fpm.sock;
        }
}

我不确定这是否是正确的方法 - 我确实知道这与变量解析顺序紧密相关,并且可能在任何 nginx 更新时失败,因此任何更好的答案都会受到赞赏。

相关内容