Nginx: Route zu index.php innerhalb eines Alias ​​für eine bestimmte Pfadkomponente

Nginx: Route zu index.php innerhalb eines Alias ​​für eine bestimmte Pfadkomponente

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 locationund das entsprechende abgleichen alias.

try_filesSie 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;

verwandte Informationen