Subdomínios de caractere curinga Nginx com o PHP ativado

4

Estou tentando configurar o Nginx como um servidor de teste para alguns projetos diferentes usando o Laravel / PHP. A idéia é que, sob /var/www , terei um número variável de subdiretórios, cada um acessado no formato subdomain.example.com .

Considere esta configuração muito simples do 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;
}

Eu tenho minha estrutura de diretórios configurada como:

/var/www
    /subdomain1
    /subdomain2
    /subdomain3

Se eu acessar subdomain1.example.com , subdomain2.example.com ou subdomain3.example.com , o arquivo index.html no subdiretório relevante será exibido. Tudo perfeito até agora.

O problema surge quando tento fazer isso funcionar com arquivos PHP. Para começar, altero a diretiva de índice para index index.php e, depois, adiciono o seguinte na diretiva 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;
    }

O Nginx aceita esta configuração sem problemas. No entanto, se eu tentar acessar subdomain1.example.com , recebo um erro 404 do Nginx, mas não há nada no registro de erros.

Se eu alterar a diretiva try_files para try_files $uri /subdomain1/index.php =404; , ela executará o arquivo index.php no diretório subdomain1 corretamente, mas isso obviamente anula o propósito porque quero que ele funcione como um curinga. O problema é que não tenho acesso à variável $ 1 da diretiva pai na diretiva location.

Eu sinto que devo estar perdendo algo bastante óbvio aqui. Alguém?

    
por Joseph 31.12.2015 / 10:43

1 resposta

3

Eu acho que já vi isso antes, onde root tem uma ligação tardia e as capturas numéricas saem do escopo. Tente usar uma captura nomeada. Algo como:

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;
        ...
    }
}
    
por 31.12.2015 / 13:20

Tags