Der Platzhalter für das Nginx-Unterverzeichnis try_files schlägt immer fehl

Der Platzhalter für das Nginx-Unterverzeichnis try_files schlägt immer fehl

Nginx 1.10.3 Ubuntu, Standard-Apt-Installation. index index.php;Befindet sich außerhalb serverdes Blocks.

Ich brauche:

  • http://example.com/test/1zeigt auf /var/www/example.com/test/1
  • http://example.com/test/2zeigt auf /var/www/example.com/test/2

..und so weiter.

Da ich zu viele Tests erstellen werde, brauche ich ein Platzhalterzeichen für try_files. Derzeit komme ich ohne Platzhalter aus:

server {
    server_name example.com;
    root   /var/www/example.com;
    location /test/1/ {
        try_files $uri $uri/ /test/1/index.php?$args;
    }
    location /test/2/ {
        try_files $uri $uri/ /test/2/index.php?$args;
    }
    location ~ \.php$ {
        ...
}

Von den vielen Empfehlungen funktioniert keine.

Einfaches PHP läuft einwandfrei. WordPress und Laravel melden „Datei nicht gefunden“:

server {
    server_name example.com;
    location ~ ^/test/(?<content>.+)$ {
        root   /var/www/example.com/test/$content;
        try_files $uri $uri/ /index.php?$args;
    }
    location ~ \.php$ {
        ...
}

Datei nicht gefunden:

server {
    server_name example.com;
    location ~ ^/test/(?<content>[^/]+) {
        root   /var/www/example.com/test/$content;
        try_files $uri $uri/ /index.php?$args;
    }
    location ~ \.php$ {
        ...
}

Bei allen folgenden Versuchen wird die PHP-Datei heruntergeladen, anstatt PHP auszuführen:

server {
    server_name example.com;
    root   /var/www/example.com;
    location ~ /(?<content>[^/]+) {
        try_files $uri $uri/ /$content/index.php?$args;
    }
    location ~ \.php$ {
        ...
}

server {
    server_name example.com;
    root   /var/www/example.com;
    location ~ /(.*)/ {
        try_files $uri $uri/ /$1/index.php?$args;
    }
    location ~ \.php$ {
        ...
}

server {
    server_name example.com;
    root   /var/www/example.com;
    location ~ /test/(?<content>[^/]+) {
        try_files $uri $uri/ /test/$content/index.php?$args;
    }
    location ~ \.php$ {
        ...
}

server {
    server_name example.com;
    root   /var/www/example.com;
    location ~ /test/(?<content>.+) {
        try_files $uri $uri/ /test/$content/index.php?$args;
    }
    location ~ \.php$ {
        ...
}

Wenn möglich, bin ich bereit, 10 $ für die richtige Antwort zu zahlen

Antwort1

Die regulären Ausdrucksblöcke werden der Reihe nach ausgewertet, daher muss locationder Block vor dem Block platziert werden, sonst werden die darunter liegenden Dateien heruntergeladen, anstatt ausgeführt zu werden. Siehe.php/test/....php/test/dieses Dokumentfür Details.

Ihre beste Version war die vorletzte. Der reguläre Ausdruck extrahiert nur das Pfadelement, das dem /test/Präfix folgt.

Kehren Sie einfach die locationBlöcke um. Beispiel:

server {
    server_name example.com;
    root   /var/www/example.com;
    location ~ \.php$ {
        ...
    }
    location ~ /test/(?<content>[^/]+) {
        try_files $uri $uri/ /test/$content/index.php?$args;
    }
}

verwandte Informationen