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

5

Estou tentando fazer a rota nginx para o index.php dentro de um alias para um caminho específico. Seria mais fácil apenas usar subdomínios (e adicionar blocos de servidores com nomes diferentes), mas meu projeto requer essa estrutura por vários motivos não tópicos. Simplificando, 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 bem padronizados: sempre exibimos o arquivo index.php (em uma determinada raiz) e deixamos que php cuide do roteamento. O número 3 simula uma construção de subdomínio (e deve apontar para index.php em um diretório diferente).

Consegui que os números 1-3 funcionassem, mas não o número 4. Sempre que eu vou para www.example.com/api/a/b, ele dá um erro 404. Os registros de erros dizem que o nginx está tentando me serve / home / user / api / public // a / b /. Eu sinto que estou muito 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;
         }
    }      
}

Obrigado antecipadamente.

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;
         }
    }      
}
    
por arothuis 13.05.2014 / 16:30

1 resposta

2

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

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

    location /api/ {
        alias /home/user/api/public/;
        try_files $uri /api/index.php;
    
por 13.05.2014 / 16:32

Tags