我正在尝试将 Nginx 设置为使用 Laravel/PHP 的几个不同项目的临时服务器。我的想法是,/var/www
我将拥有不同数量的子目录,每个子目录都以该subdomain.example.com
格式访问。
考虑这个非常简单的 Nginx 配置:
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
index index.html index.htm;
server_name ~^(.*)\.example\.com$;
root /var/www/$1;
}
我的目录结构设置为:
/var/www
/subdomain1
/subdomain2
/subdomain3
如果我访问subdomain1.example.com
,subdomain2.example.com
或者subdomain3.example.com
,则将index.html
提供相关子目录中的文件。到目前为止一切都很完美。
当我尝试使用 PHP 文件进行此操作时,问题就出现了。首先,我将 index 指令更改为index index.php
,然后在指令中添加以下内容server
:
location ~ \.php$ {
try_files $uri /index.php =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
Nginx 毫无问题地接受了此配置。但是,如果我尝试访问,subdomain1.example.com
则会收到来自 Nginx 的 404 错误,但错误日志中没有任何内容。
如果我将 try_files 指令更改为,try_files $uri /subdomain1/index.php =404;
那么它会正确执行目录index.php
中的文件subdomain1
,但这显然违背了目的,因为我希望它作为通配符工作。问题是我无法从 location 指令中的父指令访问 $1 变量。
我觉得我肯定忽略了一些非常明显的东西。有人注意到吗?
答案1
我想我以前见过这种情况,其中root
后期绑定和数字捕获超出范围。尝试使用命名捕获。类似的东西:
server {
...
server_name ~^(?<subdomain>.+)\.example\.com$;
root /var/www/$subdomain;
index index.php;
location / {
try_files $uri $uri/ /index.php;
}
location ~ \.php$ {
try_files $uri /index.php;
...
}
}