启用 PHP 的 Nginx 通配符子域名

启用 PHP 的 Nginx 通配符子域名

我正在尝试将 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.comsubdomain2.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;
        ...
    }
}

相关内容