Nginx: rota para index.php dentro do alias para componente de caminho específico

Nginx: rota para index.php dentro do alias para componente de caminho específico

Estou tentando fazer com que o nginx direcione para index.php dentro de um alias para um caminho específico. Seria mais fácil usar apenas subdomínios (e adicionar serverblocks com nomes diferentes), mas meu projeto requer essa estrutura por vários motivos não tópicos. Simplificando, eu gostaria do seguinte:

1. www.example.com         --> /home/user/www/public/index.php
2. www.example.com/a/b     --> /home/user/www/public/index.php
3. www.example.com/api     --> /home/user/api/public/index.php
4. www.example.com/api/a/b --> /home/user/api/public/index.php

Os números 1 e 2 são bastante padronizados: sempre sirva o arquivo index.php (em uma determinada raiz) e deixe o php cuidar do roteamento. O número 3 simula a construção de um subdomínio (e deve apontar para index.php em um diretório diferente).

Consegui fazer com que os números 1 a 3 funcionassem, mas não o número 4. Sempre que vou para www.example.com/api/a/b, dá um 404. Os logs de erros me dizem que o nginx está tentando me servir / home/usuário/api/public//a/b/. Sinto que estou bem perto da solução, mas não pareço acertar. Eu também seria capaz de servir arquivos estáticos da mesma maneira.

As seguintes configurações são relevantes:

server {
    listen 80;
    server_name example.com www.example.com;
    root /home/user/www/public;

    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php;
    }
    location ~ \.php$ {
            try_files $uri /index.php =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_index   index.php;
            fastcgi_pass    unix:/var/run/php5-fpm.sock;
            include         fastcgi_params;
            fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
    } 
    location /api {
        alias /home/user/api/public/;

        location ~ \.php$ {
           try_files $uri /index.php =404;
           fastcgi_split_path_info ^(.+\.php)(/.+)$;
           fastcgi_index   index.php;
           fastcgi_pass    unix:/var/run/php5-fpm.sock;
           include         fastcgi_params;
           fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
         }
    }      
}

Desde já, obrigado.

Solução

server {
    listen 80;
    server_name example.com www.example.com;
    root /home/user/www/public;

    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php;
    }
    location ~ \.php$ {
            try_files $uri /index.php =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_index   index.php;
            fastcgi_pass    unix:/var/run/php5-fpm.sock;
            include         fastcgi_params;
            fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
    } 
    location /api/ {
        alias /home/user/api/public/;
        try_files $uri /api/index.php =404;

        location ~ \.php$ {
           try_files $uri /index.php =404;
           fastcgi_split_path_info ^(.+\.php)(/.+)$;
           fastcgi_index   index.php;
           fastcgi_pass    unix:/var/run/php5-fpm.sock;
           include         fastcgi_params;
           fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
         }
    }      
}

Responder1

Você está bem perto. Mas você precisa combinar os /caracteres finais locatione seus correspondentes alias.

Você também precisa adicionar um try_filesnesse bloco para se referir ao correto index.php, que provavelmente é /api/index.php.

    location /api/ {
        alias /home/user/api/public/;
        try_files $uri /api/index.php;

informação relacionada