我正在尝试构建一个部署服务器,该服务器将具有为多个目录提供服务的通配符主机(假设我正在预览某个项目的 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 更新时失败,因此任何更好的答案都会受到赞赏。