Nginx-Standort-Regex-Variable funktioniert nicht mit try_file

Nginx-Standort-Regex-Variable funktioniert nicht mit try_file

Ich habe eine Site, auf der ich Ordner mit Staging-WordPress-Sites erstellen und löschen möchte.

die Struktur ist ungefähr so:

/wp1
/wp2
/wp3
/...

Ich verwende Nginx und bin mir bewusst, dass ich, damit dies funktioniert, mehrere Standortblöcke erstellen muss, um jede WordPress-Site zu erfassen:

location /wp1 {
    try_files $uri $uri/ /wp1/index.php?$args;
}
location /wp2 {
    try_files $uri $uri/ /wp2/index.php?$args;
}
location /wp3 {
    try_files $uri $uri/ /wp3/index.php?$args;
}
...

Diese Konfiguration funktioniert einwandfrei, ist aber schwer zu verwalten. Deshalb habe ich einen regulären Ausdruck mit dem Standort ausprobiert, um nur einen Standortblock für alle Sites zu verwenden. So kann ich einfach Ordner löschen und erstellen, ohne mich um die Nginx-Einrichtung kümmern zu müssen:

location ~ ^/wp(?<staging>\d+) {
    try_files $uri $uri/ /wp$staging/index.php?$args;
}

Aber das funktioniert nicht. Irgendwelche Ideen, was ich übersehe?

Dies ist meine vollständige Konfigurationsdatei:

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;
    root /home/city/sites/staging1/html;
    index index.php;
    location = /favicon.ico {
            log_not_found off;
            access_log off;
    }
    location = /robots.txt {
            allow all;
            log_not_found off;
            access_log off;
    }
    location / {
            try_files $uri $uri/ /index.php?$args;
    }
    location ~ ^/stg(?<staging>\d+) {
            try_files $uri $uri/ /stg$staging/index.php?$args;
    }
    location ~ \.php$ {
            include fastcgi.conf;
            fastcgi_intercept_errors on;
            fastcgi_pass unix:/run/php/php7.0-fpm.city.sock;
    }
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
            expires max;
            log_not_found off;
    }
}

Dies ist die Ausgabe voncurl -I http://ipaddress/wp2

HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Tue, 17 Jan 2017 03:45:43 GMT
Content-Type: text/html
Content-Length: 178
Location: http://ipaddress/wp2/
Connection: keep-alive

Dies ist die Ausgabe voncurl -I http://ipaddress/wp2/

HTTP/1.1 200 OK
Server: nginx
Date: Tue, 17 Jan 2017 03:45:49 GMT
Content-Type: application/octet-stream
Content-Length: 418
Last-Modified: Wed, 25 Sep 2013 00:18:11 GMT
Connection: keep-alive
ETag: "52422bc3-1a2"
Accept-Ranges: bytes

Dadurch wird jedoch die WordPress-Datei index.php heruntergeladen und der Inhaltstyp entspricht application/octet-streamnicht dem, was ich erhalten sollte.

Dies ist eine erwartete Curl-Ausgabe ohne den Regex-Standortblock, eine einfache WordPress-Site:

HTTP/1.1 200 OK
Server: nginx
Date: Tue, 17 Jan 2017 04:30:30 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Link: <http://ipaddress/wp2/wp-json/>; rel="https://api.w.org/"
Link: <http://ipaddress/wp2/>; rel=shortlink 

In den Nginx-Protokolldateien kann ich sehen, dass der Regex-Speicherort verwendet wird, aber ich verstehe nicht, wo das Problem liegt und warum ich diese Antwort erhalte:

[debug] 24359#24359: *1330 test location: "/"
[debug] 24359#24359: *1330 test location: "favicon.ico"
[debug] 24359#24359: *1330 test location: "robots.txt"
[debug] 24359#24359: *1330 test location: ~ "^/wp(?<staging>\d+)"
[debug] 24359#24359: *1330 http regex set $staging to "2"
[debug] 24359#24359: *1330 using configuration "^/wp(?<staging>\d+)"
[debug] 24359#24359: *1330 http cl:-1 max:1048576
[debug] 24359#24359: *1330 rewrite phase: 3
[debug] 24359#24359: *1330 post rewrite phase: 4
[debug] 24359#24359: *1330 generic phase: 5
[debug] 24359#24359: *1330 generic phase: 6
[debug] 24359#24359: *1330 generic phase: 7
[debug] 24359#24359: *1330 access phase: 8
[debug] 24359#24359: *1330 access phase: 9
[debug] 24359#24359: *1330 access phase: 10
[debug] 24359#24359: *1330 post access phase: 11
[debug] 24359#24359: *1330 try files phase: 12
[debug] 24359#24359: *1330 http script var: "/wp2"
[debug] 24359#24359: *1330 trying to use file: "/wp2" "/home/city/sites/staging1/html/wp2"
[debug] 24359#24359: *1330 http script var: "/wp2"
[debug] 24359#24359: *1330 trying to use dir: "/wp2" "/home/city/sites/staging1/html/wp2"
[debug] 24359#24359: *1330 try file uri: "/wp2"
[debug] 24359#24359: *1330 content phase: 13
[debug] 24359#24359: *1330 content phase: 14
[debug] 24359#24359: *1330 content phase: 15
[debug] 24359#24359: *1330 content phase: 16
[debug] 24359#24359: *1330 content phase: 17
[debug] 24359#24359: *1330 http filename: "/home/city/sites/staging1/html/wp2"

Antwort1

Das Problem scheint zu sein, dass Ihr PHP nicht ausgeführt, sondern nur heruntergeladen wird.

Gemäß Ihrem Kommentar sollten Sie die Lösung beschreiben, entweder in Ihrer eigenen Antwort, einem Kommentar zu dieser Antwort oder durch Bearbeiten Ihrer Frage. Ich denke, für Benutzer mit niedrigeren Reputationszahlen sind die Dinge etwas eingeschränkt.

Antwort2

Das Problem bestand darin, dass der Regex-Speicherort nicht Folgendes verwendete:

location ~ \.php$ {
    include fastcgi.conf;
    fastcgi_intercept_errors on;
    fastcgi_pass unix:/run/php/php7.0-fpm.city.sock;
}

was also passierte, war, dass die PHP-Datei nicht ausgeführt wurde.

Um das Problem zu lösen, fügen Sie einfach location ~ \.php$innerhalb der problematischen Regex-Position Folgendes hinzu:

location ~ ^/stg_(?<staging>\w+) {
    try_files $uri $uri/ /stg_$staging/index.php?$args;
    location ~ \.php$ {
        include fastcgi.conf;
        fastcgi_intercept_errors on;
        fastcgi_pass unix:/run/php/php7.0-fpm.city.sock;
    }
}

verwandte Informationen