
Ich richte mehrere Laravel-Apps in Unterordnern einer einzelnen Domäne ein (Social-Network-Apps, benötigen https, einzelnes Zertifikat).
Ich kann nicht herausfinden, wie man eine Nginx-Konfiguration schreibt, um HTTP-Anfragen /app1/
einer Laravel-Installation unter zuzuordnen/var/www/other_folder/public/
Hier ist die neueste Iteration der Konfigurationstests. Debug-Protokollierung ausgelassen. Der Laravel-Stammspeicherort /app1/ funktioniert, die Zuordnung von Routen ( /app1/api/method/
) jedoch nicht. Bitte helfen Sie mir, entweder zu debuggen, wie nginx die Anfrage Schritt für Schritt verarbeitet (das Debug-Protokoll ist nicht so erklärend), oder geben Sie mir einen Hinweis, wie ich Unterordner von /app1/...
zu index.php
Laravel zuordnen kann.
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
}
Antwort1
Ich denke, Sie sollten die Wurzel des Standorts ändern. Laut Nginx-Dokumentation hat die Root-Direktive auch den Kontext „Standort“:
Syntax: Stammpfad;
Kontext: http, Server, Standort, wenn am Standort
Sie sollten also in der Lage sein, etwa Folgendes zu tun:
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
}
Soweit ich es verstehe, ordnet die Alias-Direktive eine URL einer anderen URL zu und die Verarbeitung wird fortgesetzt. Sie definiert kein Verzeichnis, aus dem die Dateien bezogen werden. Ich bin mir nicht sicher, ob Sie die Umschreibung am PHP-Speicherort noch benötigen.
Antwort2
Dieser Code ist ungetestet. Aber Sie sagen, er funktioniert mit /app1/, aber nicht mit /app1/api/method/ . Ich vermute, Ihr Problem liegt in diesem Teil:
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;
}
das sagt also im Grunde, dass wir versuchen sollen, das zu versuchen url
, und wenn es nicht übereinstimmt, versuchen wir, es als Verzeichnis abzugleichen url/
, und wenn keine Dateien und Verzeichnisse vorhanden sind, versuchen wir, es als abzugleichen /app1/index.php?someargs
, und wenn es nicht existiert, ordnen wir es als zu/app1/index.php?$query_string
Erstens,Alias und Try_Filesfunktionieren nicht zusammen, Sie können stattdessen root verwenden. Ändern Sie den /app1-Standortblock wie folgt, um zu sehen, ob das Ihr Problem behebt.
location /app1 {
root /var/www/other_folder/public;
index index.php index.html;
try_files $uri $uri/ /index.php$is_args$args;
}
Zweitens ist $query_string dasselbe wie $args , der einzige Unterschied ist, dass esschreibgeschützt.
Wie gesagt, das ist ungetestet, aber es wäre schön, wenn es funktioniert. Und wenn nicht, habe ich noch eine andere Idee.