Nginx: ruta a index.php dentro de un alias para un componente de ruta específico

Nginx: ruta a index.php dentro de un alias para un componente de ruta específico

Estoy intentando hacer una ruta nginx a index.php dentro de un alias para una ruta específica. Sería más fácil usar subdominios (y agregar bloques de servidores con nombres diferentes), pero mi proyecto requiere esta estructura por varias razones no actuales. En pocas palabras, me gustaría lo siguiente:

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

Los números 1 y 2 son bastante estándar: siempre entregue el archivo index.php (en una raíz determinada) y deje que php se encargue del enrutamiento. El número 3 simula una construcción de subdominio (y debería apuntar a index.php en un directorio diferente).

Logré que los números 1-3 funcionen, pero no el número 4. Siempre que voy a www.example.com/api/a/b aparece un 404. Los registros de errores me dicen que nginx está intentando servirme / inicio/usuario/api/público//a/b/. Siento que estoy bastante cerca de la solución, pero parece que no la hago bien. También podría entregar archivos estáticos de la misma manera.

Las siguientes configuraciones son 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;
         }
    }      
}

Gracias de antemano.

Solución

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;
         }
    }      
}

Respuesta1

Estás bastante cerca. Pero es necesario hacer coincidir los /caracteres finales locationy su correspondiente alias.

También necesitas agregar un try_filesen ese bloque para hacer referencia al correcto index.php, que probablemente sea /api/index.php.

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

información relacionada