
Estou configurando vários aplicativos Laravel em subpastas de um único domínio (aplicativos de redes sociais, precisam de https, certificado único).
Não é possível descobrir como escrever a configuração do nginx para mapear solicitações HTTP para /app1/
uma instalação do Laravel em/var/www/other_folder/public/
Aqui está a última iteração de testes de configuração. Log de depuração omitido. A localização raiz do Laravel /app1/ funciona, mas o mapeamento de rotas ( /app1/api/method/
) não. Por favor, ajude, como depurar como o nginx processa a solicitação passo a passo (o log de depuração não é tão explicativo) ou me dê uma dica de como mapear subpastas para /app1/...
o index.php
Laravel.
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
}
Responder1
Eu acho que você deveria mudar a raiz do local. De acordo com a documentação do Nginx, a diretiva root também possui o contexto "local":
sintaxe: caminho raiz;
contexto: http, servidor, local, se estiver no local
Então você deve ser capaz de fazer algo como o seguinte:
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
}
Pelo que entendi, a diretiva alias remapeia uma URL para outra URL e o processamento continua, ela não define um diretório de onde originar os arquivos. Não tenho certeza se você ainda precisa reescrever o local do PHP.
Responder2
Este código não foi testado. Mas você está dizendo que funciona com /app1/ mas não com /app1/api/method/ . Eu acho que seu problema está nesta 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;
}
então isso basicamente diz para tentar o url
, e se não corresponder, tente combiná-lo como um diretório url/
, e se não existirem arquivos e diretórios, então tentamos combiná-lo como /app1/index.php?someargs
, e se não existir, combine é como/app1/index.php?$query_string
Em primeiro lugar,alias e try_filesnão funcionam juntos, então você pode usar root. Altere o bloco de localização /app1 para o seguinte para ver se isso resolve o seu problema.
location /app1 {
root /var/www/other_folder/public;
index index.php index.html;
try_files $uri $uri/ /index.php$is_args$args;
}
Segundo, $query_string é igual a $args , a única diferença é que ésomente leitura.
Como eu disse, isso não foi testado, mas seria bom se funcionasse. E quando isso não acontece, ainda tenho outra ideia.