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 location
e seus correspondentes alias
.
Você também precisa adicionar um try_files
nesse 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;