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 location
y su correspondiente alias
.
También necesitas agregar un try_files
en 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;