Ich versuche, eine Nginx-Route zur index.php innerhalb eines Alias für einen bestimmten Pfad zu erstellen. Es wäre einfacher, einfach Subdomains zu verwenden (und Serverblöcke mit unterschiedlichen Namen hinzuzufügen), aber mein Projekt erfordert diese Struktur aus mehreren nicht-thematischen Gründen. Einfach ausgedrückt hätte ich gerne Folgendes:
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
Nummer 1 und 2 sind ziemlich standardmäßig: Liefern Sie immer die Datei index.php (in einem bestimmten Stammverzeichnis) und überlassen Sie PHP das Routing. Nummer 3 simuliert die Erstellung einer Subdomain (und sollte auf index.php in einem anderen Verzeichnis verweisen).
Ich habe es geschafft, die Nummern 1 bis 3 zum Laufen zu bringen, aber nicht Nummer 4. Immer wenn ich zu www.example.com/api/a/b gehe, kommt eine 404. Die Fehlerprotokolle sagen mir, dass nginx versucht, mir /home/user/api/public//a/b/ zu liefern. Ich glaube, ich bin der Lösung ziemlich nahe, aber ich scheine es nicht richtig hinzubekommen. Ich könnte auf die gleiche Weise auch statische Dateien liefern.
Folgende Konfigurationen sind relevant:
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;
}
}
}
Dank im Voraus.
Lösung
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;
}
}
}
Antwort1
Sie sind ziemlich nah dran. Aber Sie müssen die nachfolgenden /
Zeichen für location
und das entsprechende abgleichen alias
.
try_files
Sie müssen in diesem Block auch ein hinzufügen, um auf das richtige zu verweisen index.php
, was wahrscheinlich ist /api/index.php
.
location /api/ {
alias /home/user/api/public/;
try_files $uri /api/index.php;