
Estoy configurando varias aplicaciones de Laravel en subcarpetas de un solo dominio (aplicaciones de redes sociales, necesito https, certificado único).
No puedo entender cómo escribir la configuración de nginx para asignar solicitudes HTTP /app1/
a una instalación de Laravel en/var/www/other_folder/public/
Aquí está la última versión de las pruebas de configuración. Se omitió el registro de depuración. La ubicación raíz de Laravel /app1/ funciona, pero el mapeo de rutas ( /app1/api/method/
) no. Por favor ayuda, cómo depurar cómo nginx procesa la solicitud paso a paso (el registro de depuración no es tan explicativo), o dame una pista sobre cómo asignar subcarpetas de /app1/...
Laravel index.php
.
server {
listen 80;
server_name apps.mydomain.com;
root /var/www/apps.mydomain.com/docs;
location / {
index index.html index.php;
}
location /app1 {
alias /var/www/other_folder/public;
index index.php index.html;
try_files $uri $uri/ /app1/index.php$is_args$args /app1/index.php?$query_string;
}
location ~ /app1/.+\.php$ {
rewrite ^/app1/(.*)$ /$1 break;
include /etc/nginx/fastcgi.conf;
fastcgi_param SCRIPT_FILENAME /var/www/other_folder/public$fastcgi_script_name;
fastcgi_index index.php;
fastcgi_pass php;
# Database access parameters
fastcgi_param DB_HOST "localhost";
fastcgi_param DB_USER "apps";
fastcgi_param DB_PASS "xxxxxxxx";
fastcgi_param DB_NAME "app1";
}
# Other locations skipped
include /etc/nginx/global/php.conf; # other php scripts
}
Respuesta1
Creo que deberías cambiar la raíz de la ubicación. Según la documentación de Nginx, la directiva raíz también tiene el contexto "ubicación":
sintaxis: ruta raíz;
contexto: http, servidor, ubicación, si está en la ubicación
Entonces deberías poder hacer algo como lo siguiente:
server {
listen 80;
server_name apps.mydomain.com;
root /var/www/apps.mydomain.com/docs;
location / {
index index.html index.php;
}
location /app1 {
root /var/www/other_folder/public;
rewrite ^/app1/(.*)$ /$1 break;
index index.php index.html;
try_files $uri $uri/ /index.php$is_args$args /index.php?$query_string;
}
location ~ /app1/.+\.php$ {
root /var/www/other_folder/public;
rewrite ^/app1/(.*)$ /$1 break;
include /etc/nginx/fastcgi.conf;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_index index.php;
fastcgi_pass php;
# Database access parameters
fastcgi_param DB_HOST "localhost";
fastcgi_param DB_USER "apps";
fastcgi_param DB_PASS "xxxxxxxx";
fastcgi_param DB_NAME "app1";
}
# Other locations skipped
include /etc/nginx/global/php.conf; # other php scripts
}
Hasta donde tengo entendido, la directiva de alias reasigna una URL a otra URL y el procesamiento continúa, no define un directorio desde donde obtener los archivos. No estoy seguro de si todavía necesita reescribir la ubicación de PHP.
Respuesta2
Este código no está probado. Pero estás diciendo que funciona con /app1/ pero no con /app1/api/method/ . Supongo que tu problema radica en esta parte:
location /app1 {
alias /var/www/other_folder/public;
index index.php index.html;
try_files $uri $uri/ /app1/index.php$is_args$args /app1/index.php?$query_string;
}
Entonces, esto básicamente indica que intentemos url
, y si no coincide, intentemos hacerlo coincidir como un directorio url/
, y si no existe ningún archivo ni directorio, entonces intentamos hacerlo coincidir como /app1/index.php?someargs
, y si no existe, lo hacemos coincidir. como/app1/index.php?$query_string
En primer lugar,alias y try_filesno funcionan juntos, por lo que puedes usar root en su lugar. Cambie el bloque de ubicación /app1 al siguiente para ver si soluciona su problema.
location /app1 {
root /var/www/other_folder/public;
index index.php index.html;
try_files $uri $uri/ /index.php$is_args$args;
}
En segundo lugar, $query_string es lo mismo que $args, la única diferencia es que essolo lectura.
Como dije, esto no está probado, pero sería bueno si funcionara. Y cuando no es así, todavía tengo otra idea.